Python原生模块与自建模块的效率比较
来源:互联网 发布:北邮ipv4网络电视网站 编辑:程序博客网 时间:2024/06/05 15:31
今天突发奇想,Python自带的模块究竟比自己造的轮子快多少呢?
于是测试了max和sort模块。自建max模块:
def max_iteration(list_sample): length = len(list_sample) if length <= 1: return list_sample[0] max1 = max_iteration(list_sample[:length/2]) max2 = max_iteration(list_sample[length/2:]) return max(max1, max2)用timeit计算了一下,一个长度为1000的list,结果很明显:
max iteration: 6.85511016846 max original: 0.713296890259max iteration: 6.77465510368 max original: 0.699170827866然后是sort。自建的merge sort算法如下:
def sort_iteration(list_sample): #merges sort result = [] length = len(list_sample) if length <= 1: return list_sample list1 = sort_iteration(list_sample[:length/2]) list2 = sort_iteration(list_sample[length/2:]) while (len(list1) > 0) or (len(list2) > 0): if (len(list1) > 0) and (len(list2) > 0): if list1[0] < list2[0]: result.append(list1.pop(0)) else: result.append(list2.pop(0)) elif len(list1) == 0: result.extend(list2) list2 = [] elif len(list2) == 0: result.extend(list1) list1 = [] else: print "something is wrong." raise return result
然后结果如下:
sort iteration: 31.4509849548 sort original: 1.15701317787果然啊,效率差距惊人。
当然,不管是排序,还是求最大值,都有更快的算法,比如使用最小堆栈应该可以得到更高的效率。
因为最近要使用字符串的shuffle功能,也捎带着测试了一把。字符串本身不具有shuffle功能,因此可以考虑转化为list,再shuffle,然后再转化为字符串:
def string_shuffle_list(): ''' shuffle the string with list ''' string_list = list(STRING_SAMPLE) random.shuffle(string_list) string_shuffle = ''.join(string_list) return另外一种方法是从字符串中随机取样全部的字符串元素,然后再转化为字符串:
def string_shuffle_sample(): ''' shuffle the string with sample ''' string_shuffle = ''.join(random.sample(STRING_SAMPLE, len(STRING_SAMPLE))) return第二种方法看起来更简洁,我原本以为效率会更高,结果大跌眼镜:
string shuffle with list: 168.345906019,string shuffle with sample: 207.21715498先转化为list的方法反而更快。
也可以看出两种方法都很慢,网上说时间用在了''.join()上。额,先这样吧,过几天再找更快的方法。
最后说一下timeit的用法,普通用法网上到处都是,只是没有说明怎么传入函数的参数:
def test_sort(): t1 = timeit.Timer(lambda: sort_iteration(LIST_SAMPLE)) t2 = timeit.Timer(lambda: sort_original(LIST_SAMPLE)) print("sort iteration: %s \nsort original: %s" %(t1.timeit(), t2.timeit()))
看起来,python的原生模块的效率比想像中的高的多,所以还是尽可能使用原生的模块。
————————10.17 update————————————
迭代的时候用set好还是list好呢?
def in_test(iterable): for i in iterable: pass结果一个1000大小的set和list分别是:(t1是set)
In [287]: t1.timeit()Out[287]: 59.14477300643921In [288]: t2.timeit()Out[288]: 27.456761837005615list的迭代效率更高。说实话,依然是出乎我的意料的。
当查找一个元素是否在对象内的时候,set的效率更高。
源代码:https://github.com/gt11799/test_modules_efficiency
0 0
- Python原生模块与自建模块的效率比较
- python序列化模块marshal和cPickle的效率比较
- xoops 上自建模块的学习
- 测试python的并行模块Parallel Python的效率
- 应用程序与内核模块的比较
- React-Native与原生的模块桥接(一)
- Python模块filecmp 文件比较
- React Native原生模块与JS模块通信的几种方式
- 【python】python re模块中几个比较重要的函数
- python模块与包
- Python 模块与包
- python 模块与包
- python 模块与包
- python模块与包
- python模块与包
- python---模块与包
- python-模块与包
- python 模块与包
- ARC指南 - ARC的开启和禁止
- Ubuntu root 密码忘记-恢复
- 关于H1和H2标签的使用
- HDU 4856 Tunnels(bfs+状压dp)
- UVa 455 - Periodic Strings
- Python原生模块与自建模块的效率比较
- 蓝翔营销为什么成功
- java 操作双向链表
- vim我常用的几条配置
- C++ Traits技术
- 网站被降权我们应该做什么?
- cocos2dx 2.1.4+xcode GL_STENCIL_INDEX的报错问题
- 淘宝客网站应该怎么优化?
- java 单向链表的操作