利用位操作符加速程序的运行
2016-08-03 11:40 天马行空的coding 阅读(234) 评论(0) 编辑 收藏 举报众所周知,位操作是cpu里面最快速的操作之一。但是以前在程序中,一直没有使用,可能是害怕异或是别的什么原因。可是最近在写一个小的爬虫,但是却需要爬取百万级数据,这时候想到了位操作符。
先来2个程序对比一下:
程序1:
1 #coding:utf-8 2 3 import time 4 import datetime 5 6 pagesNum = 0 7 8 def getLinks(): 9 global pagesNum 10 for i in range(0,0xfffffff): 11 pagesNum += 1 12 if pagesNum & 0xfff == 1: 13 pass 14 15 16 print('Begin:',datetime.datetime.now()) 17 18 for i in range(10): 19 getLinks() 20 print('End:',datetime.datetime.now())
运行结果如下:
Begin: 2016-08-03 10:50:13.694231
End: 2016-08-03 10:58:46.796579
程序2:
1 #coding:utf-8 2 import time 3 import datetime 4 5 pagesNum = 0 6 7 def getLinks(): 8 global pagesNum 9 for i in range(0,0xfffffff): 10 pagesNum += 1 11 if pagesNum % 4095 == 1: 12 pass 13 14 15 print('Begin:',datetime.datetime.now()) 16 17 for i in range(10): 18 getLinks() 19 print('End:',datetime.datetime.now())
运行结果:
Begin: 2016-08-03 09:42:40.624409
End: 2016-08-03 09:52:50.405286
事实证明,位运算比除法运算确实快不少。在循环中,从时间上进行直观分析,效率大概提升了12%。
Tips:
1.除法和乘法是最容易进行位运算的,%模运算也可以考虑替换为位运算。
每当乘以2的指数倍的时候,相当于<<指数位,即:num * (2^x) == num << x
每当除以2的指数倍的时候,相当于>>指数位,即:num * (2^x) == num >> x
2.程序,除了追求正确性和鲁棒性之外,就是效率!!!
************************************
给我一个支点,我可以改变整个世界!
给我一个支点,我可以改变整个世界!