Python:(显式)字符串参数会损害性能吗?

时间:2010-02-17 13:37:00

标签: python performance function parameters compile-time

假设某些函数总是得到一些它不使用的参数。

def someFunc(s):
  # do something _not_ using s, for example
  a=1

现在考虑这个电话

someFunc("the unused string")

它给出一个字符串作为参数,该参数不是在运行时构建的,而是直接编译成二进制文件(希望是正确的)。

问题是:当以这种方式调用someFunc时,例如,数千次,对“未使用的字符串”的引用总是被传递但是这会减慢程序的速度吗?

在我天真的想法中,我会说“未使用的字符串”的引用是“常量”,并且当调用someFunc时,在O(1)中可用。所以我会说'不,这不会影响表现'。

和以前一样的问题:“我是对的吗?”

感谢一些人: - )

2 个答案:

答案 0 :(得分:2)

每次都会传递字符串(通过引用),但是开销太小而不能真正影响性能,除非它处于超紧密循环中。

答案 1 :(得分:1)

这是CPython的一个实现细节,可能不适用于其他pythons但是,在很多情况下,在编译模块中,常量字符串将引用同一个对象,从而最大限度地减少了开销。

一般来说,即使它没有,你也不应该担心它,因为与其他事情相比,它可能在不知不觉中微不足道。

但是,这里有一段有趣的代码:

>>> def somefunc(x):
...    print id(x) # prints the memory address of object pointed to by x
... 
>>> 
>>> def test():
...    somefunc("hello")
... 
>>> test()
134900896
>>> test()
134900896 # Hooray, like expected, it's the same object id
>>> somefunc("h" + "ello")
134900896  # Whoa, how'd that work?

这里发生的是python保持全局字符串查找,在许多情况下,即使连接两个字符串,如果值匹配,您将获得相同的对象。

请注意,这是一个实现细节,您不应该依赖它,因为来自以下任何内容的字符串:文件,套接字,数据库,字符串切片,正则表达式或任何C模块都不能保证具有此属性。但它仍然很有趣。