我在某处读到了在python中定义函数内部的函数是不好的,因为它使得python在调用外部函数的时候创建了一个新的函数对象.有人基本上这样说:
#bad
def f():
def h():
return 4
return h()
#faster
def h():
return 4
def f(h=h):
return h()
Run Code Online (Sandbox Code Playgroud)
这是真的?另外,当我有这么多常量的情况怎么样:
x = # long tuple of strings
# and several more similar tuples
# which are used to build up data structures
def f(x):
#parse x using constants above
return parse dictionary
Run Code Online (Sandbox Code Playgroud)
如果我将所有常量放在f的定义中,它会更快吗?或者我应该将它们留在外面并将它们绑定到关键字参数中的本地名称?不幸的是,我没有任何数据可以做时间,所以我想我问的是你有类似事情的经历.
简短的回答你的问题 - 这是事实.每次调用外部函数时都会创建内部函数,这需要一些时间.与访问局部变量相比,对函数外部定义的对象的访问速度较慢.
但是,你还问了一个更重要的问题 - "我应该关心吗?".答案,几乎总是,不.性能差异非常小,代码的可读性更有价值.
所以,如果你认为这个函数属于其他函数的主体而在其他地方没有任何意义 - 只需将其置于内部并且不关心性能(至少,直到你的分析器告诉你).
在我的测试中,完成我需要的最快方法是在外部定义我需要的所有常量,然后列出需要这些常量的函数列表,然后将函数列表传递给主函数。我使用dis.dis、cProfile.run、 和timeit.timeit进行测试,但我找不到基准测试脚本,也懒得重写它并给出结果。