Python Cookbook:各种字符串拼接方法的效率究竟如何
2017-07-26 本文已影响34人
碎冰op
很多人都吹Python一定要看Python Cookbook掌握一些小技巧,然而里面部分代码似乎根本没有实际测试过。
举个例子
这里说道,+=比生成器慢,真的有敲过代码测试过时间吗???
可以把以下代码直接黏贴到在线代码测试查看运行时间
以下是测试代码
import timeit
from time import clock
l = ['ACME', 50, 91.1]
a = clock()
s = ''
for i in l:
s += i
b = clock()
s = ''.join(str(i) for i in l)
c = clock()
s = []
for i in l:
s.append(i)
s = ''.join(s)
d = clock()
print((b - a)*1000000)#0.26
print((c - b)*1000000)#0.43
print((d - c)*1000000)#0.17
二十次测试下来,第三种方法,list的append再join是最快的,第二种是最慢的才对。
要让生成器方式比循环+=快,必须是列表本身存在大量元素,导致+=反复申请内存的情况,比如
import timeit
from time import clock
l = ['pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab']
a = clock()
s = ''
for i in l:
s += i
b = clock()
s = ''.join(str(i) for i in l)
c = clock()
s = []
for i in l:
s.append(i)
s = ''.join(s)
d = clock()
print((b - a)*1000000)#83.8
print((c - b)*100000)#63.1
print((d - c)*100000)#43.1
即使如此还是第三种最快
当然,最快的其实是
s = ''.join([i for i in l])
列表生成式比生成器的劣势是可能消耗大量内存。
那么看cookbook本页面中紧接的下一段,
import timeit
from time import clock
a = clock()
print('a' + ':' + 'b' + ':' + 'c')
b = clock()
print(':'.join(['a', 'b', 'c']))
c = clock()
print('a', 'b', 'c', sep=':')
d = clock()
print((b - a)*100000)#1.60
print((c - b)*100000)#0.42
print((d - c)*100000)#0.74
二十次测试后,第三种所谓better的性能,比第二种又慢了1倍。
那么如果大量内存的情况下,这里还会又能稍微对那么一点吗?
import timeit
from time import clock
a = clock()
print('pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab' + ':' + 'pythontab')
b = clock()
print(':'.join(['pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab',]))
c = clock()
print('pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab','pythontab', sep=':')
d = clock()
print((b - a)*100000)#101.7
print((c - b)*100000)#32.1
print((d - c)*100000)#400.9
第三种现在是最慢的,耗时是+的4倍。简直就是放屁........
尽信书不如无书。