Python Cookbook:各种字符串拼接方法的效率究竟如何

很多人都吹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倍。简直就是放屁........

尽信书不如无书。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,511评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,422评论 19 139
  • 使用maven profile实现多环境配置(代码) maven profile 实现多环境可移植构建 在开发过程...
    ZZS_简阅读 2,498评论 0 0
  • 你知道凌晨两点的天空是怎样的吗? 你愿意为了客户深夜穿过整座城市吗? 你能忍气吞声笑对背叛过你的人吗? 你是否曾经...
    查五阅读 1,495评论 0 0
  • 昨天晚上,老公再次提议让婆婆回老家一个月,回去照顾他弟弟。理由是他弟弟自从暑假生的那场脑炎,一直没有得到良好的休息...
    工作与养娃兼顾的女人阅读 3,682评论 4 3