这是我第一次在这里发帖,希望你们能回答我的问题。
我正在编写一个Python脚本,使用eratosthenes的筛子找到所有素数达到某个数n。为了提高程序的效率,我想筛选出适合CPU L1缓存的“段”中的数字范围。我知道自己的L1缓存,它是576 KB。但我希望这个程序可以在任何计算机上运行。
有什么办法可以获得CPU的L1缓存吗?我特别想要L1缓存,而不是L2或L3。
答案 0 :(得分:2)
Python是一种“garbage collection
”语言。其中一个结果就是根据需要自动分配和释放内存。这会产生内存碎片,可能会导致转移到CPU缓存。也不可能直接在内存中更改数据结构的布局,这意味着总线上的一次传输可能不包含计算的所有相关信息 - 即使它可能都适合总线宽度。它基本上伤害了保持L1 / L2缓存充满相关数据以进行下一次计算的任何前景。
另一个问题来自Python的动态类型而不是被编译。许多C
开发人员通常会在某些时候意识到编译器通常比它们更聪明。编译器可以执行许多技巧来影响事物的布局,CPU如何运行某些指令,以什么顺序运行,以及优化它们的最佳方法。但是,Python并没有被编译,更糟糕的是,它具有动态类型,这意味着由于在运行时可以更改代码功能,因此推断使用算法进行优化的任何可能机会都会成倍增加。
正如评论中所提到的,有办法缓解这些问题,最重要的是CPython
或Python的Cython
扩展 - 它允许编译Python代码。