2017-05-15 21 views
0

大きなデータセットからオブジェクトを解析するとき、私はしばしば情報を集合オブジェクトに集約し、それをリストに変換してソートします。例えば変数名の上書きはパフォーマンス上のメリットをもたらしますか?

、ここでのコードスニペットのようになります。

all_times = set([]) 

for row in dataset: 
    time = parse_out_time(row) 
    all_times.add(time) 

sorted_times = sorted(list(all_times)) 

私の質問は、その最後の割り当てについてです。私はPythonが再利用されていない古い変数名に割り当てられたデータを削除するには自動ガベージコレクションを持っていることを知ってソートされたリスト

all_times = sorted(list(all_times)) 

と同じ変数名を再割り当てすることができます。このアプローチは、Pythonインタプリタが古いセットのall_timesに属するメモリを直ちに割り当て解除できるように思えます。上記のコードを数百万のデータセットのループで実行すると、これが重要になる可能性があります。

あなたが再び使用することのない変数名を書くと、パフォーマンス上の利点がありますか?あるいは、Pythonのガベージコレクタは、スクリプトによってもう一度呼び出されない変数のメモリをすぐに割り当て解除するのに十分なほどスマートですか?

+0

*「名前でもう一度参照しない」*とはどういう意味ですか?名前が定義されているスコープの終わりまで、それらの名前で再度アクセスされるかどうかに関わらず、その名前によって引き続き参照されます。 – jonrsharpe

+0

@jonrsharpeスクリプトがその変数をもう一度呼び出さないという明確化を追加しました – kingledion

+2

それから、私が知っている限り、そのような最適化はありません。大規模で不要なオブジェクトを保持することが懸念されている場合は、使用していない識別子を明示的に 'del'する必要があります(現在行っているように他のものに割り当てる必要があります)そのような最適化が不十分な実装では正しく動作します。 – jonrsharpe

答えて

0

私はあなたがそれを正しく行うならば、あなたの必要に応じてそれほど多くのリソースを要するとは思わない。

つまり、このコードをループに実行すると、2つの変数しか使用されません。

このコードを関数に入れて関数をループに実行すると、状況が少し変わります。また、この機能をマルチスレッドのタスクとして実行すると、少し時間がかかります。

2

Pythonはコードの静的解析を行いません。変数にバインドされたオブジェクトの参照カウントは、その変数が有効範​​囲外になるまで保持されます(たとえば、return)。変数は再割り当てされます(all_times = sorted(list(all_times))。または削除されます(del all_times)。 setの場合は、含まれているデータを取り除くためにall_times.clear()を実行することもできます。 4つは、もはや必要のないコンテナを取り除くための合理的な方法です。

含まれるデータがまだsorted_timesであることに注意してください。削除されたのは、そのセットで使用されているハッシュテーブルだけです。その可能性はどちらかというと大きな助けにならないでしょう。

関連する問題