9

Python の文体のベスト プラクティスは科学的コーディングに適用されますか?

科学的な Python コードを読みやすく保つのは難しいと感じています。

たとえば、変数に意味のある名前を使用し、名前空間の順序を維持するためにimport *. したがって、例えば:

    import numpy as np
    normbar = np.random.normal(mean, std, np.shape(foo))

しかし、これらの提案は、特に 79 文字の行幅を考えると、読みにくいコードになる可能性があります。たとえば、次の操作を書きました。

net["weights"][ix1][ix2] += lrate * (CD / nCases - opts["weightcost_pretrain"].dot(net["weights"][ix1][ix2]))

式を複数の行にまたがることができます:

net["weights"][ix1][ix2] += lrate * (CD / nCases - 
     opts["weightcost_pretrain"].dot(net["weights"][ix1][ix2]))

しかし、これはあまり良くないように見えます.2行目をどれだけ深くインデントすればよいかわかりません. この種の行の継続は、ネストされたループに二重インデントされ、1 行で使用できる文字数が 50 文字しかない場合、さらに複雑になります。

科学的な Python が不格好に見えることを受け入れる必要がありますか、それとも上記の例のような行を回避する方法はありますか?

いくつかの潜在的なアプローチは次のとおりです。

  • 短い変数名を使用する
  • 短いディクショナリ キー名を使用する
  • numpy 関数を直接インポートして短い名前を割り当てる
  • 算術演算の組み合わせに対するヘルパー関数の定義
  • 操作を細かく分割し、各行に 1 つ配置する

これらのうちどれを追求し、どれを避けるべきかについての知恵と、他の救済策の提案をいただければ幸いです.

4

2 に答える 2

2

スタイル ガイドは常に適用されると思います。科学的な作業に毎日 Python を使用していますが、長い行を論理的な構成要素に分割しておけば、コードをより簡単に読むことができ、数か月後にはほとんど労力をかけずにコードに戻ることができます。賢明な変数名、または関数を使用しました。

私はもっ​​とこのようなことをします:

weights = net["weights"][ix1][ix2]
opts_arr = opts["weightcost_pretrain"]
weights += lrate * (CD / nCases - opts_arr.dot(weights))

Python が「簡潔」であるというもう 1 つの言い方は、Python が構文的に密集しているということです。Python の長い行は、Java の長い行よりも読んで理解するのが難しいと思います (特に、サードパーティ ライブラリの高レベル関数を使用する場合)。 NumPy などの低レベル ロジックを非表示にします)。

于 2013-08-08T20:26:10.360 に答える