- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
def sieve(n):
nums = [0] * n
for i in range(2, int(n**0.5)+1):
if nums[i] == 0:
for j in range(i*i, n, i):
nums[j] = 1
return [i for i in range(2, n) if nums[i] == 0]
def sieve_var(n):
nums = [0] * n
for i in range(3, int(n**0.5)+1, 2):
if nums[i] == 0:
for j in range(i*i, n, i):
nums[j] = 1
return [2] + [i for i in range(3, n, 2) if nums[i] == 0]
在我的机器上,sieve(10**8)
sieve_var(10**8)
需要 2.28 秒需要 2.67 秒。我不认为 pypy 的预热时间是这里的罪魁祸首,所以为什么不是 sieve_var
,迭代次数更少,速度更快?在标准 python 3.3 中 sieve_var
正如预期的那样更快。在 Windows 8.1 上使用 pypy 4.0.1 32 位。
编辑:作为测试,我添加了 count = 0
在函数的开头和 count += 1
在内循环中(nums[j] = 1
所在的位置)。 sieve(10**8)
计数 242570202 而 sieve_var(10**8)
计数为 192570204。因此尽管 sieve_var
的计数没有减半,它正在做更少的“工作”。
为了好玩,这里有一个带有切片索引的版本:
def sieve_slice(n):
sieve = [True] * n
for i in range(3,int(n**0.5)+1,2):
if sieve[i]:
sieve[i*i::2*i]=[False]*((n-i*i-1)//(2*i)+1)
return [2] + [i for i in range(3,n,2) if sieve[i]]
使用 python 3.6,sieve_slice
运行速度比 sieve
快约 4 倍, 但使用 pypy3 7.3.0, sieve
运行速度比 sieve_slice
快约 2 倍.
最佳答案
我不确定为什么它在 Windows 上会稍微慢一些。在 Linux 上速度是一样的。但是,我可以回答为什么我们大部分的速度相同。如果程序是用 C 编写的,答案也是一样的,而且答案完全在处理器级别。该程序绑定(bind)在访问列表的内存 I/O 上,大小为 400 或 800MB。在第二个版本中,您基本上避免了一次额外的 if nums[i] == 0
检查。不过,这个额外的检查不需要任何费用,因为 CPU 在上一次迭代期间只是在其缓存中获取了 nums[i - 1]
,并且在迭代期间需要 nums[i + 1]
下一次迭代。无论如何,CPU 都在等待内存。
为了验证我在说什么,请尝试使 nums
数组更紧凑。我尝试用 nums[i//2]
访问它,假设 i
总是奇数,结果快了两倍。如果不使用 Python 列表(在 32 位 PyPy 上存储为 32 位整数数组),而是使用位数组(但它的代码要多得多,因为没有标准的内置位数组)。
关于python - 为什么这种改进的筛子使用 pypy 会变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811418/
在PyPy的 build 阶段,该脚本会生成一些看起来非常有趣的漂亮 ASCII 字符。每个字符代表什么?如何解释这个输出?在生成这种 ASCII 艺术时,PyPy build 到底在做什么? 最佳答
如何使用 PyPy(最好是 pypy3)而不是带有 poetry 的标准 python? 也就是说,pyproject.toml中应该存储什么?是否还需要进行其他更改? 最佳答案 事实证明,它就像安装
将 pypy 实现转换为 c 文件并在配备 2G 内存和 Intel Core2 2GHz CPU 的现代笔记本上构建 pypy-c 需要花费数小时。 我知道这是一个 CPU 密集型任务,但它必须这么
每次在 PyPI 上发布 Virtualenv 的新版本时,我都希望收到通知,最好通过电子邮件或 RSS 提要。这可能吗? 最佳答案 是的,可以从 pypi.org 获得 RSS 提要,请参阅:htt
我有一个 Python 扩展,需要针对基于 Windows 的 Appveyor 持续集成服务上的 PyPy 解释器进行编译。我如何在那种环境中获得 PyPy? 最佳答案 将此 PowerShell
PyPy GIL 是 RPython 中 PyPy 解释器实现的一部分,还是 translate.py 自动添加的东西?即,如果我要在 RPython 中编写自己的新语言解释器并通过 translat
我已阅读 PyPy -- How can it possibly beat CPython?以及无数其他事情,但我无法理解用 Python 编写的东西如何比 Python 本身更快。 我能想到的唯一方
我正在处理一些 OpenAI 的 API 集成。我在安装 tiktoken(用于 OpenAI 模型的快速 BPE 标记器)时遇到问题。 当我尝试在我的 macbook 机器上运行时: pip3 in
我正在处理一些 OpenAI 的 API 集成。我在安装 tiktoken(用于 OpenAI 模型的快速 BPE 标记器)时遇到问题。 当我尝试在我的 macbook 机器上运行时: pip3 in
这可能是一个非常愚蠢的问题,但是“PyPy”和“PyPI”之间有什么区别?它们是一回事吗? 最佳答案 PyPy是 python 的替代实现: PyPy is a fast, compliant alt
我想在与 Python 2.7 版本兼容的 window 7 上卸载 pypy 版本。控制面板的“卸载程序”中没有 pypy。到目前为止,我还没有找到任何文档。 最佳答案 PyPy 不会在 Windo
PyPy 是否在编译时进行静态类型检查以在编译时捕获类型错误?如果不是,像 HM 类型推断这样的东西是否有助于在编译时捕获这些错误? 最佳答案 否 在两个帐户上。 (我假设 PyPy 是指具有 JIT
我在弄清楚如何让我的 Python 包处理到 PyPi 时遇到了一些问题,这样我就可以很容易地将它与其他项目的其他依赖项一起安装(即使用需求条目或简单的“pip install xyz”)-这里列出了
例如,如果我有一个 Pypi 上已经存在的包 foo。我希望能够在我的 setup.py 中使用新版本号进行 git Push origin master 操作,然后 Pypi 以某种方式自动更新其版
新版 PyPy 附带了集成的 Stackless。据我所知,捆绑的 Stackless 与 2001 年的原始 Stackless 不同。所以主要是带有调度器的绿色线程框架。 Greenlet 是 S
我按照指南 How to submit a package to PyPI提交一个包裹。它抛出了以下错误: Traceback (most recent call last): Fi
我使用诗歌创建了一个Python包然后我使用诗歌构建、诗歌发布将我的包发布到 PyPI,但 PyPI 中缺少我的包描述。 该项目托管在 GitHub 中:https://github.com/fsis
我听说过很多关于 PyPy 项目的信息。他们声称它比 CPython 上的 their site 解释器快 6.3 倍。 每当我们谈论 Python 等动态语言时,速度都是最重要的问题之一。为了解决这
我们将 artifactoy 更新到最新版本 5.10.3 以支持 pypi 更新。 在这次更新之后,我们遇到了一些非常慢的 pip install --upgrade 时间。pip install
我一直在 ESP32-WROOM-32D 上使用 uasyncio。在所有测试之后,我正在尝试将固件用于我的其他板,但默认情况下 uasyncio 并未与 micropython 一起安装。我尝试通过
我是一名优秀的程序员,十分优秀!