문제

이 코드를 실행하여 Keyczar 암호화 라이브러리 Google에서 :

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

결과를 확장하기위한 파이썬 세션은 다음과 같습니다.

>>> 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에는 _fastmath라는 C 모듈이 있으며 공개 키 운영에 GNU MP를 사용합니다. 사용할 수없는 경우 Python의 기본 긴 정수를 사용하여 훨씬 느립니다.

두 파일은 src/_fastmath.c 및 lib/crypto/publickey/_slowmath.py입니다.

Windows의 Python은 GNU MP가 포함되어 있지 않을 수 있으므로 Windows에서는 대신 _slowmath.py를 사용합니다.

다른 팁

그런 종류의 차이를 위해, 나는 Linux가 작업에 c- 모듈을 사용하고 있다고 의심합니다. 아마도 Windows 버전이 어딘가에 DLL을 설치하지 못 했으므로 Python 코드로 다시 떨어질 것입니다.

두 플랫폼에서 동일한 버전의 Python을 실행하고 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top