知行编程网知行编程网  2022-11-07 16:30 知行编程网 隐藏边栏  12 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于如何优化python的效率的相关知识,包括python为什么叫爬虫,以及python优化算法这些编程知识,希望对大家有参考作用。

优化python效率的方法: 1.优化算法的时间复杂度; 2、减少冗余数据; 3、合理使用copy和deepcopy; 4、使用dict或set查找元素; 5.合理使用generators和yields。

如何优化python的效率

优化方法:

(推荐教程:


1、优化算法时间复杂度

算法的时间复杂度影响程序的执行效率。在 Python 中,可以通过选择合适的数据结构来优化时间复杂度。例如,list和set查找某个元素的时间复杂度分别为O(n)和O(1)。


2、减少冗余数据

比如用上三角或者下三角来保存一个大的对称矩阵。在大多数元素为 0 的矩阵中使用稀疏矩阵表示。


3、合理使用copy与deepcopy

对于dict、list等数据结构的对象,直接赋值采用引用的方式。在某些情况下,你需要复制整个对象。这种情况下,可以使用copy包中的copy和deepcopy。这两个函数的区别在于后者是递归复制的。效率也不同:(以下程序在ipython中运行)

import copy
a = range(100000)
%timeit -n 10 copy.copy(a) # 运行10次 copy.copy(a)
%timeit -n 10 copy.deepcopy(a)
10 loops, best of 3: 1.55 ms per loop
10 loops, best of 3: 151 ms per loop

timeit后面的-n表示运行次数,最后两行对应两次timeit的输出,下同。可以看出,后者慢了一个数量级。


4、使用dict或set查找元素

python dict和set都是使用哈希表实现的(类似于c++11标准库中的unordered_map),查找元素的时间复杂度为O(1)

a = range(1000)
s = set(a)
d = dict((i,1) for i in a)
%timeit -n 10000 100 in d
%timeit -n 10000 100 in s
10000 loops, best of 3: 43.5 ns per loop
10000 loops, best of 3: 49.6 ns per loop

dict的效率略高(占用的空间也多一些)。


5、合理使用生成器(generator)和yield

%timeit -n 100 a = (i for i in range(100000))
%timeit -n 100 b = [i for i in range(100000)]
100 loops, best of 3: 1.54 ms per loop
100 loops, best of 3: 4.56 ms per loop

使用()获取生成器对象,所需内存空间与列表大小无关,因此效率会更高。在特定应用中,例如 set(i for i in range(100000)) 将比 set([i for i in range(100000)]) 快。

但是对于需要循环遍历的情况:

%timeit -n 10 for x in (i for i in range(100000)): pass
%timeit -n 10 for x in [i for i in range(100000)]: pass
10 loops, best of 3: 6.51 ms per loop
10 loops, best of 3: 5.54 ms per loop

后者效率更高,但如果循环中有中断,使用生成器的好处是显而易见的。 yield 也用于创建生成器:

def yield_func(ls):
for i in ls:
yield i+1
 def not_yield_func(ls):
return [i+1 for i in ls]
 ls = range(1000000)
%timeit -n 10 for i in yield_func(ls):pass
%timeit -n 10 for i in not_yield_func(ls):pass
10 loops, best of 3: 63.8 ms per loop
10 loops, best of 3: 62.9 ms per loop

对于内存不是很大的列表,可以直接返回一个列表,但是可读性收益更好(个人喜好)。

python2.x内置generator功能的有xrange函数、itertools包等。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享