Python:获取处理器&x27;一级缓存

Python:获取处理器&x27;一级缓存,python,caching,primes,Python,Caching,Primes,这是我第一次在这里发帖,我希望你们能回答我的问题 我正在编写一个Python脚本,它使用eratosthenes的筛子查找所有素数,直到某个数n。为了使程序更高效,我想筛选适合CPU一级缓存的“段”中的数字范围。我知道我自己的一级缓存,576KB。但我希望这个程序能在任何计算机上运行 有什么方法可以获取CPU的一级缓存吗?我特别想要一级缓存,而不是二级或三级缓存 Python是一种“”语言。这样做的一个后果是,内存会根据需要自动分配和释放。这会产生内存碎片,从而将传输分离到CPU缓存。也不可能直

这是我第一次在这里发帖,我希望你们能回答我的问题

我正在编写一个Python脚本,它使用eratosthenes的筛子查找所有素数,直到某个数n。为了使程序更高效,我想筛选适合CPU一级缓存的“段”中的数字范围。我知道我自己的一级缓存,576KB。但我希望这个程序能在任何计算机上运行

有什么方法可以获取CPU的一级缓存吗?我特别想要一级缓存,而不是二级或三级缓存

Python是一种“”语言。这样做的一个后果是,内存会根据需要自动分配和释放。这会产生内存碎片,从而将传输分离到CPU缓存。也不可能直接在内存中更改数据结构的布局,这意味着总线上的一次传输可能不包含计算的所有相关信息,即使它可能都符合总线宽度。它本质上损害了在下一次计算中用相关数据填充L1/L2缓存的任何前景

另一个问题来自Python的动态类型,并且没有被编译。许多
C
开发人员通常会在某些时候意识到编译器通常比他们更聪明。编译器可以执行许多技巧来影响事情的布局、CPU将如何运行某些指令、以什么顺序运行以及优化这些指令的最佳方式。然而,Python并没有被编译,更糟糕的是,它具有动态类型,这意味着推断任何可能的算法优化机会都是非常困难的,因为代码功能可以在运行时更改


正如在评论中提到的,有一些方法可以缓解这些问题,最重要的是
CPython
或Python的
Cython
扩展-它允许编译Python代码。

即使可以,为什么您认为这会以任何有意义的方式加快您的程序?您真的有576KB的一级缓存吗?我很确定英特尔芯片总是二次幂,只能达到32K/32K,除了上一代的一些Xeon在实现64K/32K之前没有加速任何实际负载。假设你有一级缓存的大小,它会告诉你关于段的最佳大小是什么?您没有在汇编中编码。它是一种解释脚本语言。它将对属于一级缓存的内容有自己的看法。将段的大小设置为缓存的大小可能没有帮助。在每个系统上,您都必须尝试多种大小的缓存,以了解什么最有效。但是,你可以直接尝试不同的大小,而不必首先查找一级缓存的大小。我有一个AMD Ryzen 5 1600,它有576 KB的一级缓存。无论如何,如果你想优化一个Eratosthenes筛选,你的第一步应该是:(1)确保你实际实现了这个筛选,而不是一个相当于在Scheme教科书上发表的、并从那时起就在全世界传播的慢得多的算法。(2) 使用PyPy而不是CPython、numpy或gmpy。(3) 分析Python代码并优化高级Python内容。(4) 再次评测它,并对全局查找等小事情进行微优化…(42)在解释器运行代码时评测解释器,并担心CPU缓存。