1

:Pythonで大量の分割データを処理しています。そして、私は奇妙な状況にあります。

これは私の同僚によって書かれた元のコードです:

tag = word[i].split(":")[0].decode('utf8')
value = int(word[i].split(":")[1])

また、1回の呼び出しで十分な場所で関数を2回呼び出したため、非効率的だと思いますsplit。そのため、次のように変更します。

tokens = word[i].split(":")
tag = tokens[0].decode('utf8')
value = int(tokens[1])

そして、この後、非常に奇妙なことが起こります。

ログを使用してコードのパフォーマンスを記録しました10 second。1000行のデータを処理するには約sかかりますが、変更後は1000行のデータを処理するのに約1秒かかり50 secondsます。

なぜこれが起こるのですか?1回の呼び出しが2回の呼び出しよりも高速であると想定されていませんか?

アドバイスありがとうございます。

4

1 に答える 1

4

ログは、短いコードセクションのベンチマークを行うための良い方法ではありません。システムでは他にもかなりのことが起こっています。timeitモジュールを使用すると、より正確な結果が得られます。

Python 2.6.6 (r266:84292, Sep 15 2010, 15:52:39) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> word = ["answer:42"]
>>> def split1(word=word):
...     tag = word[0].split(":")[0].decode("utf-8")
...     value = int(word[0].split(":")[1])
... 
>>> def split2(word=word):
...     tokens = word[0].split(":") 
...     tag = tokens[0].decode("utf-8")
...     value = int(tokens[1])
... 
>>> t2 = timeit.Timer("split2()", "from __main__ import split2")
>>> t2.timeit()
2.5862038135528564
>>> t1 = timeit.Timer("split1()", "from __main__ import split1")
>>> t1.timeit()
2.8647868633270264
于 2012-06-29T08:26:59.170 に答える