首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows环境下python库keyczar的性能

Windows环境下python库keyczar的性能
EN

Stack Overflow用户
提问于 2010-01-15 19:26:51
回答 2查看 779关注 0票数 2

我运行这段代码是为了查看谷歌密钥加解密库对性能的影响:

代码语言:javascript
复制
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分钟。在同一台机器上的Ubuntu9.04分区下,500次迭代大约需要6秒。

我尝试过分析这个(cProfile + pstats),但是我在解释结果方面没有太多的经验。

有人能告诉我为什么相同的代码在Windows下运行150+时慢一倍吗?

编辑2010-01-16

下面是我的generate_key.py脚本:

代码语言:javascript
复制
from keyczar import keyczar, keys

key = keys.RsaPrivateKey.Generate()

下面是我在generate_key中创建一个stats文件的命令行

代码语言:javascript
复制
C:\temp\python-keyczar-0.6b\tests\keyczar>python -m cProfile -o generate_key generate_key.py

下面是扩展结果的python会话:

代码语言:javascript
复制
>>> 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中执行。大部分运行时都在这里度过:

代码语言:javascript
复制
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从这里下载。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-21 14:27:25

PyCrypto有一个名为_fastmath的C模块,它将GNU用于公钥操作。如果它不可用,则使用Python的本地长整数,这些整数要慢得多。

这两个文件是src/_Quickmath.c和lib/Crypto/PublicKey/_celmath.py。

Windows上的Python很可能不包括GNU,所以在Windows上使用_slowmath.py

票数 1
EN

Stack Overflow用户

发布于 2010-01-15 21:21:06

对于这种差异,我怀疑linux正在使用c-模块来完成工作。也许Windows版本无法在某个地方安装dll,因此返回到Python代码

在这两个平台上运行相同版本的Python吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2074195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档