1

timeit モジュールを使用してパフォーマンスを測定しながら、いくつかの異なるアルゴリズム (16x16 の数独を解くため) を相互にテストしています。ただし、最初の timeit.repeat() 反復のみが実際に計算されているように見えます。これは、他の反復がはるかに高速になっているためです。t.repeat(repeat=10, number=1) を使用して単一のアルゴリズムをテストすると、次の結果が得られます。

[+] 次の結果: solve1 (関数 1/1)
[+] 最速........: 0.00003099
[+] 最遅........: 32.38717794
[+] 平均*........: 0.00003335 (最小/最大値なしで計算された平均)

10 の結果のうち最初の結果は、完了するまでに常にはるかに長い時間がかかります。これは、timeit.repeat() ループの 2 から 10 までの反復がループの前の反復のキャッシュされた結果を何らかの形で使用するという事実によってのみ説明できるようです。実際に for ループで timeit.repeat() を使用していくつかのアルゴリズムを相互に比較すると、パズルの解が 1 回だけ計算されるように見えます。

[+] 結果: solve1 (関数 1/3)
[+] 最速........: 0.00003099
[+] 最遅........: 16.33443809
[+] 平均*........: 0.00003263 (最小/最大値なしで計算された平均)

[+] 結果: solve2 (関数 2/3)
[+] 最速........: 0.00365305
[+] 最遅..........: 0.02915907
[+] 平均*........: 0.00647599 (最小/最大値なしで計算された平均)

[+] 結果: solve3 (関数 3/3)
[+] 最速........: 0.00659299
[+] 最遅........: 0.02440906
[+] 平均*........: 0.00717765 (最小/最大値なしで計算された平均)

本当に奇妙なことは、アルゴリズムの相対速度 (相互に関連する) が測定全体で一貫していることです。これは、すべてのアルゴリズムが独自の結果を計算していることを示しています。この極端なパフォーマンスの向上は、中間結果 (最初のソリューションの計算時に取得) の大部分がまだ何らかのキャッシュにあり、Python プロセスによって予約されているためですか?

どんな助け/洞察も大歓迎です。

4

1 に答える 1

2

メモリ割り当てが問題だと思います。

Python インタープリター自体がメモリ プールを保持しており、これはメモリ プールなし (またはほとんどない?) から始まります。プログラムの最初の実行後、(システムから) 多くのメモリが割り当てられ、(プールに) 解放されます。その後、次の実行でプールからメモリが取得されます。これは、システムからメモリを要求するよりもはるかに高速です。

ただし、これは、アルゴリズムが多くのメモリを消費する場合にのみ意味があります。

于 2012-06-12T10:13:19.620 に答える