【问题标题】:Python implementation of c++ algorithm using L1 CPU Cache使用L1 CPU Cache的c++算法的Python实现
【发布时间】:2018-04-13 00:59:13
【问题描述】:

我正在寻找一个带有分段筛子的 Eratosthenes 筛子的 python 实现,并使用 CPU 的 L1 缓存。

我在 github 上有自己的版本:https://github.com/nick599/PythonMathsAlgorithms/blob/master/segmented_soe_v6.py,它不使用 CPU 的 L1 缓存大小。

我找到了以下站点 - http://primesieve.org/segmented_sieve.html,它提供了使用 L1 缓存大小的 C++ 实现。它说它比我的算法快得多(我的算法需要几分钟才能创建高达 10^7 的素数,并且由于内存使用而挂在 10^8 上)。

我正在 Linux Mint v17 上开发,python 版本:2.74。 更新我的 CPU 是 Intel i7。

我对 python 还很陌生。

我想知道:

  1. 如何开始实现这个 C++ 算法的 python 版本?
  2. 我需要考虑什么?
  3. C++ 实现中是否存在无法在 Python 2.74 中编码的内容?
  4. 多线程呢?
  5. 那么超线程呢?
  6. python 的 GIL 呢?

寻找能够回答我上述所有问题的精神的答案。欢迎提供提示和技巧。

【问题讨论】:

    标签: python c++ python-2.7 sieve-of-eratosthenes


    【解决方案1】:

    我不确定您是否可以对 Python 如何使用内存做出足够的假设,以确保它有效地使用 L1 缓存。 此外,10^8 仅为 1/2 Gig,因此您当前的实现在元素分配方面的效率肯定很低。 如果您只想在每个位置存储一个标志,您最好创建最大可能的字符串并将其作为您的筛子存储进行索引,而不是使用整数数组? 当然可以使用字符串作为分段筛存储,如果幸运的话,它们可能小到可以存放在 L1 缓存中。 C 有一些很好的位索引和操作,我确信在 python 中可以使用它来允许您独立地操作每个位。您可以对字符值进行位操作。

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2017-02-25
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      相关资源
      最近更新 更多