在Python中导入模块的优化

use*_*312 4 python premature-optimization

我正在阅读David Beazley的Python参考书,他指出了一点:

例如,如果您执行了大量的平方根运算,则使用'from math import sqrt'和'sqrt(x)'而不是键入'math.sqrt(x)'会更快.

和:

对于涉及大量使用方法或模块查找的计算,通过首先将要执行的操作放入局部变量来消除属性查找几乎总是更好.

我决定尝试一下:

第一()

def first():
    from collections import defaultdict
    x = defaultdict(list)
Run Code Online (Sandbox Code Playgroud)

第二()

def second():
    import collections
    x = collections.defaultdict(list)
Run Code Online (Sandbox Code Playgroud)

结果是:

2.15461492538
1.39850616455
Run Code Online (Sandbox Code Playgroud)

这些优化对我来说可能无关紧要.但我很好奇为什么Beazley所写的与之相反的结果是真实的.请注意,存在1秒的差异,这是重要的,因为任务是微不足道的.

为什么会这样?

更新:

我得到的时间如下:

print timeit('first()', 'from __main__ import first');
print timeit('second()', 'from __main__ import second');
Run Code Online (Sandbox Code Playgroud)

Dou*_*der 6

from collections import defaultdictimport collections应该是迭代定时环路外,因为你不会重复做他们.

我想from语法必须做更多的工作,import语法.

使用此测试代码:

#!/usr/bin/env python

import timeit

from collections import defaultdict
import collections

def first():
    from collections import defaultdict
    x = defaultdict(list)

def firstwithout():
    x = defaultdict(list)

def second():
    import collections
    x = collections.defaultdict(list)

def secondwithout():
    x = collections.defaultdict(list)

print "first with import",timeit.timeit('first()', 'from __main__ import first');
print "second with import",timeit.timeit('second()', 'from __main__ import second');

print "first without import",timeit.timeit('firstwithout()', 'from __main__ import firstwithout');
print "second without import",timeit.timeit('secondwithout()', 'from __main__ import secondwithout');
Run Code Online (Sandbox Code Playgroud)

我得到了结果:

first with import 1.61359190941
second with import 1.02904295921
first without import 0.344709157944
second without import 0.449721097946
Run Code Online (Sandbox Code Playgroud)

这显示了重复进口的成本.