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倍。简直就是放屁........

尽信书不如无书。

上一篇下一篇

猜你喜欢

热点阅读