26

200K という非常に大きな Python スクリプトがあり、使用するメモリをできるだけ少なくしたいと考えています。次のようになります。

# a lot of data structures
r = [34, 78, 43, 12, 99]

# a lot of functions that I use all the time
def func1(word):
    return len(word) + 2

# a lot of functions that I rarely use
def func1(word):
    return len(word) + 2


# my main loop
while 1:
   # lots of code
   # calls functions

めったに使わない関数をモジュールに入れて、必要な場合だけ動的にインポートすると、データにアクセスできなくなります。それは私が得た限りです。

私はpythonが初めてです。

誰かが私を正しい道に導くことができますか? この大きなスクリプトを分割してメモリ使用量を減らすにはどうすればよいですか? めったに使用されないコードをモジュールに入れ、必要なときにのみ呼び出す価値はありますか?

4

5 に答える 5

43

組織化:

あなたの python スクリプトは確かに巨大なようです。最初にコードを再編成して、いくつかのモジュールまたはパッケージに分割することを検討する必要があります。おそらく、コードのプロファイリングと最適化タスクが容易になります。

あなたはそこを見たいと思うかもしれません:

そしておそらく:

最適化:

コードを最適化するためにできることはたくさんあります...

たとえば、データ構造に関して...リストまたはリスト内包表記を多用する場合、リストが本当に必要な場所と、タプルなどの変更不可能なデータ構造またはジェネレータ式のような「揮発性」オブジェクト、「遅延」コンテナ。

見る:

これらのページでは、役立つ情報とヒントを見つけることができます。

また、物事を行う方法を研究し、貪欲ではない方法があるかどうか、Python で行う方が良い方法があるかどうかを検討する必要があります (タグpythonicでいくつかのヒントを見つけることができます) ... それは特にです。 Python では true です。なぜなら、Python では、他の方法よりも優れていることを行う"明白な" 方法が 1 つ(そして 1 つだけ) あることが多いからです ( The Zen of Pythonを参照)。これはpythonicと言われています。コードの形状とは特に関係ありませんが、何よりもパフォーマンスと関係があります。何をするにも多くの方法があるべきだという考えを促進する多くの言語とは異なり、Python は最善の方法のみに焦点を当てることを好みます。明らかに、何かを行うには多くの方法がありますが、多くの場合、その 1 つは実際にはより良い。

ここで、pythonicality はアルゴリズムを調整しないため、物事を行うのに最適な方法を使用しているかどうかも確認する必要があります。

しかし最後に、それはコードによって異なり、それを見ずに答えることは困難です。

そして、 eumiroAmrによるコメントを必ず考慮してください。

于 2012-06-12T18:50:18.500 に答える
5

このビデオはあなたにいくつかの良いアイデアを与えるかもしれません:http: //pyvideo.org/video/451/pycon-2011 --- quot-dude--where--39-s-my-ram-- quot-

于 2012-06-12T18:33:43.680 に答える
3

ジェネレータ式とモジュールの利用に関するアドバイスは良いです。時期尚早の最適化は問題を引き起こしますが、コードを書く前に、常に設計について数分間考えるべきです。特に、そのコードが再利用されることを意図している場合。

ちなみに、スクリプトの先頭に多くのデータ構造が定義されているとおっしゃいましたが、これは、それらがすべて最初にメモリに読み込まれることを意味します。これが非常に大きなデータセットである場合は、特定のデータセットを別のファイルに移動し、必要な場合にのみ読み込むことを検討してください。(csvモジュール、またはnumpy.loadtxt()などを使用)

メモリの使用量を減らすこととは別に、メモリをより効率的に使用する方法も検討してください。たとえば、数値データの大規模なセットの場合、numpy 配列は、計算のパフォーマンスを向上させる情報を格納する方法です。http://wiki.python.org/moin/PythonSpeed/PerformanceTipsに少し古いアドバイスがあります

于 2012-06-12T19:01:56.647 に答える
2

関数を移動しても、メモリ使用量は変わりません。その他のモジュールをインポートするとすぐに、モジュール内のすべての関数が定義されます。しかし、関数は多くのメモリを消費しません。関数をリファクタリングすることでコードを減らすことができますか?

@eumiro の質問は正しいです。スクリプトがメモリを使いすぎていますか? どのくらいのメモリを使用し、なぜ多すぎるのですか?

于 2012-06-12T18:11:37.587 に答える