Windowsでのpythonライブラリkeyczarのパフォーマンス
質問
私はGoogleからの keyczar暗号化ライブラリでのパフォーマンスへの影響を確認するには、このコードを実行しています:
from keyczar import keyczar, keys
def main(iters):
key = keys.RsaPrivateKey.Generate()
msg = "ciao"
crypt = None
for i in range(iters):
print i, "\r",
crypt = key.Encrypt(msg)
for i in range(iters):
print i, "\r",
key.Decrypt(crypt)
if __name__ == '__main__':
main(500)
Windows環境下では、500回の反復は、約16分かかります。同じマシン上のUbuntu 9.04パーティションの下では、500回の反復は、約6秒かかります。
私はこの(cProfile + pstats)をプロファイリングしようとしましたが、私は結果を解釈する際に多くの経験を持っていない。
同じコードは、Windowsの下で150以上倍遅くを実行する理由誰かが私に言うことはできますか?
<時間>編集2010-01-16
ここに私のgenerate_key.pyスクリプトがあります:
from keyczar import keyczar, keys
key = keys.RsaPrivateKey.Generate()
ここに私のコマンドラインはgenerate_key
で統計情報ファイルを作成することです
C:\temp\python-keyczar-0.6b\tests\keyczar>python -m cProfile -o generate_key generate_key.py
ここでの結果を拡張するために私のpythonのセッションです:
>>> import pstats
>>> p = pstats.Stats('generate_key')
>>> p.strip_dirs().sort_stats(-1).print_stats(25)
Sat Jan 16 12:18:43 2010 generate_key
83493 function calls (82974 primitive calls) in 5.131 CPU seconds
Ordered by: standard name
List reduced from 564 to 25 due to restriction <25>
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 <string>:1(<module>)
1 0.000 0.000 0.210 0.210 AES.py:1(<module>)
1 0.022 0.022 0.210 0.210 AES.py:1(__bootstrap__)
1 0.000 0.000 0.000 0.000 DSA.py:115(DSAobj)
1 0.001 0.001 0.005 0.005 DSA.py:14(<module>)
1 0.000 0.000 0.000 0.000 DSA.py:174(DSAobj_c)
1 0.000 0.000 0.000 0.000 DSA.py:26(error)
1 0.000 0.000 0.001 0.001 RSA.py:125(size)
1 0.000 0.000 0.000 0.000 RSA.py:13(<module>)
1 0.000 0.000 0.000 0.000 RSA.py:140(publickey)
1 0.000 0.000 0.000 0.000 RSA.py:146(RSAobj_c)
1 0.000 0.000 0.000 0.000 RSA.py:23(error)
1 0.000 0.000 4.816 4.816 RSA.py:26(generate)
1 0.000 0.000 0.000 0.000 RSA.py:63(construct)
1 0.000 0.000 0.000 0.000 RSA.py:85(RSAobj)
1 0.003 0.003 0.004 0.004 SHA.py:4(<module>)
1 0.000 0.000 0.000 0.000 __future__.py:48(<module>)
1 0.000 0.000 0.000 0.000 __future__.py:74(_Feature)
7 0.000 0.000 0.000 0.000 __future__.py:75(__init__)
8 0.000 0.000 0.000 0.000 __init__.py:1(<module>)
1 0.000 0.000 0.000 0.000 __init__.py:11(<module>)
1 0.000 0.000 0.000 0.000 __init__.py:13(<module>)
1 0.000 0.000 0.000 0.000 __init__.py:18(<module>)
1 0.000 0.000 0.000 0.000 __init__.py:20(<module>)
2 0.000 0.000 0.000 0.000 __init__.py:24(<module>)
<pstats.Stats instance at 0x023F5E40>
>>>
だから、WindowsのコードはPythonで実行しません。ランタイムのほとんどはここに費やされます:
def generate(bits, randfunc, progress_func=None):
"""generate(bits:int, randfunc:callable, progress_func:callable)
Generate an RSA key of length 'bits', using 'randfunc' to get
random data and 'progress_func', if present, to display
the progress of the key generation.
"""
obj=RSAobj()
# Generate the prime factors of n
if progress_func:
progress_func('p,q\n')
p = q = 1L
while number.size(p*q) < bits:
p = pubkey.getPrime(bits/2, randfunc)
q = pubkey.getPrime(bits/2, randfunc)
# p shall be smaller than q (for calc of u)
if p > q:
(p, q)=(q, p)
obj.p = p
obj.q = q
if progress_func:
progress_func('u\n')
obj.u = pubkey.inverse(obj.p, obj.q)
obj.n = obj.p*obj.q
obj.e = 65537L
if progress_func:
progress_func('d\n')
obj.d=pubkey.inverse(obj.e, (obj.p-1)*(obj.q-1))
assert bits <= 1+obj.size(), "Generated key is too small"
return obj
私はここでからPyCryptoのdownloadeを実行していますのます。
解決
PyCryptoは、公開鍵操作にGNU MPを使用_fastmath呼ばCモジュールを有しています。それが利用できない場合、代わりにそれははるかに遅いですPythonのネイティブ長整数を使用します。
2つのファイルであるのsrc / _fastmath.cとlib /暗号/のPublicKey / _slowmath.py
これは、Windows上のPythonはGNU MPが含まれていない可能性が高いですが、Windows上ではなく_slowmath.py使用していますので、
他のヒント
の違いのようなもののために、私は、Linuxが動作するためにC-モジュールを使用していると思われるでしょう。おそらく、Windows版は、どこかのDLLをインストールすることができなかったので、Pythonコードにフォールバックされます。
あなたは両方のプラットフォームでPythonの同じバージョンを実行していますか?