首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

简单聊聊py的高性能编程

高性能编程的含义是通过编写更为高效的代码或者改变操作方式,也就是找到更合适的算法去降低时间上的开销。 计算机的模型可以分为三种,分别是计算单元(CPU,GPU),存储单元(硬盘,内存之类的)还有它们之间的连接。计算单元给我们的是我们能有 多块的速度去解决问题,它可以将接受到的输入变成对应的输出以及改变状态的能力。存储单元一方面是能存多少数据,另一方面是对这些数据的读写有多快,越靠近CPU的存储速度越快 ,其包含的数据量也越少。计算单元和存储单元之间的连接则是决定了数据移动的数据有多快,光速是有限的,它决定着物理的极限,总线带宽也决定着一次传输能有多少数据。 #一个简单计算质数的代码,按照其实还有更好的优化方法,具体请看《编程珠玑》 import math import time def check_prime(number): sqrt_number = math.sqrt(number) start = time.time() for i in range(2, int(sqrt_number) + 1): if (number / i).is_integer(): return False end = time.time() print('sum_time',end-start) return True check_prime(10000000) check_prime(10000019) 理想的计算模型:(以下不是真实的python计算过程,只是为了讲解) 1.number的值会存放在随机存储器上,为了计算sqrt_number,需要将number传入到CPU当中去。在传入的时候应该尽可能的利用靠近 CPU的缓存,而不是如下的写法: sqrt_number = math.sqrt(number) number_float = float(sqrt_number) 这样意味着将数据两次经过总线传输,将数据尽可能的少移动,保持在需要的地方是必须的。也就是说移动计算,而不是移动数据。 2.python的虚拟机为了尽可能的抽象做了很多工作,但是相应的牺牲了性能,比如 快: for i in haystack: if (exp): return False return True 慢: value = True for i in haystack: if (exp): value = False return True 虽然结果是一样,但是运行时间在足够大的数据量就会发生巨大的差别,这也是上述所说的尽可能的少移动数据 3.为了可以矢量操作,也就是在循环时将循环值也就是i值尽可能的一次性读入CPU,在CPU内进行计算,返回相应的值,需要借助numpy这样的用C写的库区实现, 4.抽象的代价也意味着python的对象不再是内存中的最优化布局,因为内存需要自动处理并且释放,这就影响了向CPU缓存的效率。 5.动态语言不可避免的代价就是,没有编译器从全局角度去优化对象的内存布局和CPU指令 6.最后一个则是臭名昭著的GIL了。

01
领券