代码改变世界

利用位操作符加速程序的运行

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.程序,除了追求正确性和鲁棒性之外,就是效率!!!