Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:字符串参数(显式)会影响性能吗?_Python_Performance_Function_Parameters_Compile Time - Fatal编程技术网

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

Python:字符串参数(显式)会影响性能吗?,python,performance,function,parameters,compile-time,Python,Performance,Function,Parameters,Compile Time,假设某个函数总是获取一些它不使用的参数 def someFunc(s): # do something _not_ using s, for example a=1 现在考虑这个调用< /p> someFunc("the unused string") 它给出一个字符串作为参数,该参数不是在运行时生成的,而是直接编译成二进制(希望是这样) 问题是:当以这种方式调用someFunc,比如说多次时,总是传递对“未使用的字符串”的引用,但这会降低程序的速度吗 在我的天真想法中,我会说对“未

假设某个函数总是获取一些它不使用的参数

def someFunc(s):
  # do something _not_ using s, for example
  a=1
现在考虑这个调用< /p>
someFunc("the unused string")
它给出一个字符串作为参数,该参数不是在运行时生成的,而是直接编译成二进制(希望是这样)

问题是:当以这种方式调用someFunc,比如说多次时,总是传递对“未使用的字符串”的引用,但这会降低程序的速度吗

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

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


感谢:-)

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

这是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模块中的字符串都不能保证具有此属性。尽管如此,这还是很有趣。

False-这不是不可变对象的引用,而是一个副本>>>def(x):print id(x)>>>s='immutable string'>>>id(s)11829760>>>f(s)11829760@jcoon:所有Python对象都作为引用传递,所以您是说引用被复制了?或者您的意思是先复制底层字符串对象,然后提供新的引用?你在说什么?这也是我感兴趣的地方,因为这实际上是我所问问题的一个重要部分——想象一下每次通话时都会复制一个非常大的字符串。这就是不这样做的理由。如果只传递一个ref,则不会有任何(性能)命中。前者-如果对传递的字符串执行任何操作,则会对被引用变量的副本执行操作,该副本仅适用于该函数的作用域。当您为此反汇编它们的字节码时,您看到了什么?