代码之家  ›  专栏  ›  技术社区  ›  Supamee

为什么在python中导入的函数较慢

  •  -1
  • Supamee  · 技术社区  · 6 年前

    我尝试重新构造代码以在另一个文件中定义函数,但发现它的运行速度似乎有点慢。我想知道是否有人知道如何防止这种减速,或者是否有一个已知的原因。我已经理解了Python中的导入与复制粘贴代码相同,所以这种慢下来对我来说很奇怪。

    一个例子:

    from datetime import datetime
    from import_test import small_test_import
    
    def small_test(x):
        return x+1
    
    start1 = datetime.now()
    for i in range(x):
        Z=small_test(1)
    end1 = datetime.now()
    print(end1-start1) #1.355964
    
    start2 = datetime.now()
    for i in range(x):
        Z=small_test_import(1)
    end2 = datetime.now()
    print(end2-start2) #1.433045
    

    或者使用timeit:

    def wrapper(func, *args, **kwargs):
        def wrapped():
             return func(*args, **kwargs)
        return wrapped
    
    wrapped = wrapper(small_test, 1)
    print(timeit.timeit(wrapped,number=x)) #1.8407
    wrapped = wrapper(small_test_imported, 1)
    print(timeit.timeit(wrapped, number=x)) #2.1006
    

    我知道这不是一个巨大的时差,但它是一致的。

    1 回复  |  直到 6 年前
        1
  •  1
  •   stackeks    6 年前

    如果我没弄错的话,您在脚本中打印的时间差显示大约0.8秒的差异?导入的函数可能并不慢,但是您的测试设置给了它一个缺点:它必须清除现有的 Z 对象。脚本重新使用了变量 Z 因此,第二个for循环必须清除绑定到的对象(返回值) Z 在第一次测试中。

    使用此代码再次尝试测量:

    start1 = datetime.now()
    for i in range(x):
        X = small_test(1)
    end1 = datetime.now()
    print(end1-start1)
    
    start2 = datetime.now()
    for i in range(x):
        Y = small_test_import(1)
    end2 = datetime.now()
    print(end2-start2)
    

    它不应该产生显著的差异。