优化python效率的方法: 1.优化算法的时间复杂度; 2、减少冗余数据; 3、合理使用copy和deepcopy; 4、使用dict或set查找元素; 5.合理使用generators和yields。
优化方法:
(推荐教程:
)
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包等。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 机器学习从理论到工程的第一步-编程语言篇12/29
- ♥ python tkinter 如何获取标签内容?10/01
- ♥ Python实战:猜数字游戏10/22
- ♥ python中列表求和的方法有哪些?09/13
- ♥ Python温度转换华氏度实现11/12
- ♥ 我可以在手机上编写 python 代码吗?如何实现?10/17
内容反馈