举一个例子,编写一个函数计算一串数字里所有偶数的个数,其实是很简单的问题,但是有些人是用生成器这么写的:
in[66]:def f1(x):
....:return sum(c in'02468'for c in str(x))
....:
in[68]: x = int('1234567890'*50)
in[69]:%timeit f1(x)
10000 loops, best of 5:52.2µs per loop
生成器这么用其实是速度最慢的一种做法,花费了52微秒。我们来看看如果我改成列表解析式会怎么样:
in[67]:def f2(x):
....:return sum([c in'02468'for c in str(x)])
in[68]: x = int('1234567890'*50)
in[70]:%timeit f2(x)
10000 loops, best of 5:40.5µs per loop
你看,这个 加速非常地明显,仅花费了40.5微秒 。
而且还能进一步改进, 如果我们改变之前定义的f2,让它在列表解析式后判断数字是否为偶数,是偶数才会成为最终生成的列表中的一员,这样有另一个加速:
in[71]:def f3(x):
....:return sum([truefor c in str(x)if c in'02468'])
....:
in[72]:%timeit f3(x)
10000 loops, best of 5:34.9µs per loop
34.9微秒,perfect! 不仅如此,还能继续加速!sum对于整数有一个快速路径,但是这个快速路径只激活类型为int. bool不行,因此我们把true改成1,能更再加一次速!
in[73]:def f4(x):
....:return sum([1for c in str(x)if c in'02468'])
....:
in[74]:%timeit f4(x)
10000 loops, best of 5:33.3µs per loop
又快了,33.3微秒!怎么样,小伙伴们学到了吗
如何看待人工智能
高通第三代骁龙8采用4纳米工艺 支持在终端侧运行超100亿参数的生成式AI
哈佛研发激光无线电收发器,将用于超高速Wi-Fi
骨传导蓝牙耳机什么牌子好、骨传导耳机推荐
再出事故 特斯拉Model S安全性得到肯定
Python生成器的使用方法
用1.3万字来介绍最基础的元器件--电阻
赌上全部身家,贾跃亭为造车拼了!
IC Insights:预计4Q2018全球IC市场同比增长率仅为6%
“云端”研发的机器人,为防疫工作带来很大帮助
关于常见种子仪器的作用的简单介绍
人员定位解决方案,智能化的养老院定位管理
变频器在卷染机的应用案例简析
新唐科技W584B041主板介绍
变电站直流系统接地故障的危害和预防措施
新型“机器蟑螂”可行走、下水和在水面上游泳
苹果布局液晶技术削减3D摄像头成本 考虑恢复Touch ID可能性
基于HoloLens的AR框架能够对心肌疤痕进行3D全息视觉呈现
第十届IOTE 2018夏季展,八大热点应用技术
语音识别与物联网自动化导论