tri*_*alt 18 python performance python-3.x
我只是注意到,如果我+在print()函数中使用连接并在shell中运行代码,文本会更快地出现.然而,在使用时,,文本看起来要慢得多,就像使用"正在输入"的动画效果一样.
这两者之间是否存在效率差异?
Jim*_*ard 25
虽然我不怀疑它们之间存在很大的差异,但它们显然略有不同.
print在打印之前,CPython的窥孔优化器可以连接一个连接文字字符串的调用,从而加快执行速度,这可能就是你所看到的.除此之外,对于小字符串,只传递一个参数并且因此sep不使用的事实也是一个小的好处.
对于较大的字符串,需要创建一个大的临时字符串来保持其连接,从而抵消所有速度差异.(sep由于大小及其连接,未使用且仅传递一个参数的事实被打败)
使用,在打印通话将通过每个字符串作为参数,并使用默认分开吧sep.虽然这显然需要更多的工作,但是当涉及大字符串时,同样的工作也会消失.
因此,对于实际上被优化器捕获的小字符串,连接速度会快一些:
%timeit print("a" + "b", file=f)
1000000 loops, best of 3: 1.76 µs per loop
%timeit print("a", "b", sep='', file=f)
100000 loops, best of 3: 2.48 µs per loop
Run Code Online (Sandbox Code Playgroud)
即使优化器无法加入它们:
a = "a"; b = "b"
%timeit print(a + b, file=f)
1000000 loops, best of 3: 2 µs per loop
%timeit print(a, b, sep='', file=f)
100000 loops, best of 3: 2.45 µs per loop
Run Code Online (Sandbox Code Playgroud)
当字符串大小增加时,这个小差异就会黯然失色:
s1, s2 = "s" * 100000, "s"*100000
%timeit print(s1 + s2, file=f)
1000 loops, best of 3: 374 µs per loop
%timeit print(s1, s2, sep='', file=f)
1000 loops, best of 3: 373 µs per loop
Run Code Online (Sandbox Code Playgroud)
Mar*_*ein 20
编辑:似乎问题不在于操作的性质和速度,这在本答案中没有讨论!
不同之处在于,+使用连接创建较大的字符串以传递给print函数,同时,将多个字符串传递给print函数.请注意,这些行为对于print函数并不特殊:连接只是字符串上的一种方法,而逗号总是用于分隔函数参数.
例如,使用串联:
print('hello' + ' ' + 'world')
Run Code Online (Sandbox Code Playgroud)
这首先连接三个字符串形成'hello world',然后打印出来.
使用多个参数时:
print('hello', 'world')
Run Code Online (Sandbox Code Playgroud)
这会将两个字符串传递给print函数.正如您在此处所读到的,该 print函数将一个或多个对象作为参数,并将它们打印为另一个参数,sep默认情况下是一个空格.因此,这会产生与前一个示例相同的输出.
请注意,可以将任意数量的参数传递给print函数,并且这些参数本身可以是连接的字符串:
print('i' + ' ' + 'want', 'to', 'print', 'some', 'strings')
Run Code Online (Sandbox Code Playgroud)
好的部分是你可以指定sep参数来改变行为:
print('mary', 'peter', 'bob', sep=' and ')
Run Code Online (Sandbox Code Playgroud)
结果: mary and peter and bob