Python: 显式字符串参数会影响性能吗?
假设有一个函数,它总是接收一个参数 s,但这个参数在函数内部并没有被使用。
def someFunc(s):
# do something _not_ using s, for example
a=1
现在考虑这样一次调用:
someFunc("the unused string")
这里传入的参数是一个字符串,这个字符串不是在程序运行时生成的,而是直接编译进了程序的二进制文件里(希望这个理解是对的)。
问题是:如果以这种方式调用 someFunc 几千次,虽然“未使用的字符串”的引用总是被传递,这会不会导致程序变慢呢?
在我简单的想法里,我认为“未使用的字符串”的引用是‘常量’,在调用 someFunc 时可以在 O(1) 的时间内获取。所以我觉得‘不会影响性能’。
之前的问题一样:“我这样想对吗?”
谢谢大家的帮助 :-)
2 个回答
2
这是CPython的一个实现细节,可能不适用于其他版本的Python。不过在很多情况下,在一个编译模块中,一个常量字符串会引用同一个对象,这样可以减少开销。
一般来说,即使不是这样,你也不需要太担心,因为这和其他事情相比,影响是微乎其微的。
不过,这里有一段有趣的代码:
>>> 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模块的字符串都不一定具备这个特性。不过,这依然是个有趣的点。
2
每次都是通过引用传递这个字符串,但这个过程的开销非常小,基本上不会影响性能,除非是在一个非常紧凑的循环里。