2

セットアップに依存するコードの時間を計りたい。セットアップ コードは次のようになります。

>>> b = range(1, 1001)

そして、時間を計りたいコードは、漠然と次のようになります。

>>> sorted(b)

私のコードがソートとは異なる関数を使用していることを除いて。しかし、それは今重要ではありません。

とにかく、文字列を timeit に渡す限り、このコードの時間を計る方法を知っています。

>>> import timeit
>>> t = timeit.Timer("sorted(b)", "b = range(1, 1001)")
>>> min(t.repeat(3, 100))

setup callable を使用して stmt callable がアクセスできる名前空間に何かを入れるにはどうすればよいですか?

つまり、呼び出し可能オブジェクトを含む文字列ではなく、呼び出し可能オブジェクトを使用して、上記のコードと同じことを行うにはどうすればよいでしょうか?

ちなみに、ここでのより大きな目標は、単体テストのコードを再利用してパフォーマンスを測定することです。

import unittest
class TestSorting(unittest.TestCase):

    def setUp(self):
        self.b = range(1, 1001)

    def test_sorted(self):
        sorted(self.b)

私は少し仕事をすることを期待しています。timeit のセットアップでは TestSorting のインスタンスを作成する必要があり、stmt コードはその特定のインスタンスを使用する必要があります。

timeit セットアップで timeit stmt と同じ名前空間に要素を配置する方法を理解したら、unittest.TestCase インスタンスを timeit.Timer に直接フィードできるものに変換する方法を検討します。

マット

4

2 に答える 2

1

2.6では、ドキュメントに従って、「ただそれを行う」ことができます:

バージョン 2.6 で変更:パラメータstmtsetupパラメータは、引数なしで呼び出し可能なオブジェクトも取れるようになりました。これにより、それらへの呼び出しがタイマー関数に埋め込まれ、それが によって実行されtimeit()ます。この場合、余分な関数呼び出しがあるため、タイミング オーバーヘッドが少し大きくなることに注意してください。

古いバージョンの Python を使用していませんか? その場合、Python 2.6 のtimer.pyソースを取得し、それらを使用しているバージョンに「バックポート」することをお勧めします。そのバージョンが 2.5 の場合は難しくありません (時間をさかのぼる必要があるほど難しくなります。もちろん)。通常、これは「実稼働」コードにはお勧めしませんが、テスト、デバッグ、パフォーマンス測定などをサポートするコードでは問題ありません。

于 2010-05-12T14:43:21.900 に答える
1

ここでこの質問の変形を尋ねましたが、問題を解決しない回答も得ました。私たち二人とも、Pythonic という言葉で問題を明確に説明できていないと思います。

これがハックなのか、回避策なのか、それともどのように行うべきなのかはわかりませんが、うまくいきます:

>>> import timeit
>>> b = range(1, 1001)
>>> t = timeit.Timer('sorted(b)', setup='from __main__ import b')
>>> t.repeat(3, 100)
[0.0024309158325195312, 0.0024671554565429688, 0.0024020671844482422]
# was it really running 'sorted(b)'? let's compare'
>>> t = timeit.Timer('pass', setup='from __main__ import b')
>>> t.repeat(3, 100) 
[3.0994415283203125e-06, 2.1457672119140625e-06, 1.9073486328125e-06] 
# teeny times for 'pass', 'sorted(b)' took more time

私は timeit.py を読みました。それはステートメントを構築することで機能し、メインの名前空間に (一見) 接続されていない新しい名前空間を使用してeval()を呼び出します。sortedは組み込みであるため、内部の評価された式timeit.repeat()は名前にアクセスできることに注意してください。それがあなたの場合は、するdef必要がありますfrom __main__ import b, myfunc

これよりも適切な方法で目的を達成できることを願っています。

于 2010-05-12T15:36:02.177 に答える