标签: pypy

与手写的C相比,pypy能否快速处理线程和套接字?

与手写的C相比,pypy能否快速处理线程和套接字?与普通的蟒蛇相比?

我只是尝试一下,但有问题的python代码是为一小群计算机编写的,我不是管理员.我在这里问,因为我的谷歌尝试只提供了与cython,unladen swallow等的比较,如果这不太可行,我不想让管理员知道它.

我实际上并不需要pypy来擅长C; 我正在寻找使用它,因为现在解释器的开销完全掩盖了我想要计算的计算.我只需要pypy让我在手写的C附近.

c python sockets multithreading pypy

7
推荐指数
1
解决办法
2620
查看次数

使用Pygame和PyPy

我对python很新,但我想通过制作游戏来学习它,而pygame似乎是最好的选择.由于PyPy是python的最快实现(我认为),我决定使用那个.但我不知道如何让这两个人一起工作.

我在窗户上.

如果有人愿意一步一步地告诉我我需要做什么,我会非常感激.

到目前为止,我已经安装(解压缩到文件夹)PyPy,将pypy.exe设置为打开.py文件的默认设置,安装Pygame并尝试运行其中一个示例.py文件.我在文件中的第一个导入行中收到"模块pygame not found"错误.

python pygame pypy

7
推荐指数
1
解决办法
5821
查看次数

用于编译Python/Boo/Ruby语法的工具,用于C/C++/LLVM/Javascript(使用JS ArrayBuffer提高速度)

我正在尝试将使用Pythonic语义编写的代码自动编译/转换为本机和快速Javascript代码.

有什么工具可以做到这一点,可以像Java等一样提供良好的调试支持?

有没有人这样做过?

为什么?

我正在尝试用复杂的主循环,时间轴,一些物理模拟和一些复杂的交互来编写一些可视化代码.IE:它是一个实际的CPU绑定问题.

使用Javascript编写并在其浏览器环境中进行测试比在一个体面的IDE中运行的Java,.NET或Python更难调试.但是对于使用复杂的客户端代码进行实际的大规模Web开发,至少需要编译为Javascript,如果不直接写入它.

背景:最新进展

Emscripten允许将C/C++编译为Javascript,由于ArrayBuffer的类型化阵列支持和新的浏览器JS引擎,可以在浏览器中提高效率,因为ASM.jsLLJS利用了Mozilla最近的速度改进(其他供应商可能很快跟随).

Altjs.org有一个Javascript holternaltives的清单,但是还没有专注于最近的速度改进或特别好的语义,但它已成为人们用更好的工具为浏览器编码的常见地方.特别是Emscripten有很多令人惊叹的演示.

已考虑的可能选择:

  • Shedskin - 目前我已经尝试过让Shedskin工作,但我的C++/C技能有限(Emscripten只为它使用的Boehm灵感垃圾收集器公开了一个C API,Shedskin需要一个C++垃圾收集类来处理它的对象,它不存在然而).
  • UnLden Swallow/RPython,到LLVM - 尚未能在Ubuntu上正确设置
  • Boo到Java然后到LLVM(还没能在我的Ubuntu系统上安装)

附加限制:

  • 我需要在我的Ubuntu系统上使用它.
  • 编译的Javascript应该小于1 MB
  • 仍然可以使用本地语言(也是交叉编译)进行调试,从而可以利用现有的调试工具.

"构建指令表的这个过程应该非常有趣.它不需要成为苦差事的真正危险,因为任何非常机械的过程都可能被转移到机器本身." - 艾伦·图灵,1946年

javascript python firefox pypy llvm

7
推荐指数
1
解决办法
1374
查看次数

优化PyPy

(这是PyPy统计分析器的后续)

我在PyPy下运行一些Python代码,并希望对其进行优化.

在Python中,我会使用statproflineprofiler知道哪些确切的行导致减速并尝试解决它们.但是在PyPy中,两个工具都没有真正报告合理的结果,因为PyPy可能会优化掉某些行.我也不愿意使用,cProfile因为我发现很难提炼报告功能的哪一部分是瓶颈.

有没有人有关于如何进行的一些提示?也许是另一个在PyPy下运行良好的分析器?一般来说,如何为PyPy优化Python代码?

python optimization profiling pypy

7
推荐指数
1
解决办法
1159
查看次数

PyPy:在具有整数的列表中使用None时会导致严重的性能损失

因为我想要实现的算法使用索引,1..n并且因为它非常容易将每个索引移动一个,所以我决定变得聪明并在每个列表的开头插入一个虚拟元素,因此我可以使用本文中的原始公式.

为了简洁起见,请考虑以下玩具示例:

def calc(N):
    nums=[0]+range(1,N+1)
    return sum(nums[1:]) #skip first element
Run Code Online (Sandbox Code Playgroud)

但是,我担心,我的结果是虚假的,因为我可以在某处意外访问第0个元素而不是意识到它.所以我变得更聪明,None而不是0作为第一个元素使用 - 每次算术操作都会导致运行时错误:

def calc_safe(N):
    nums=[None]+range(1,N+1) #here we use "None"
    return sum(nums[1:]) 
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,这个小小的变化导致了pypy的巨大性能损失(即使使用当前的5.8版本) - 代码变得慢了大约10倍!这是我机器上的时间:

                    pypy-5.8    cpython
calc(10**8)         0.5 sec     5.5 sec
calc_safe(10**8)    7.5 sec     5.5 sec
Run Code Online (Sandbox Code Playgroud)

作为一个侧节点:Cpython不关心,是否None使用.

所以我的问题是双重的:

  1. 显然使用None不是一个好主意,但为什么呢?
  2. 是否有可能获得None-approach 的安全性并保持性能?

编辑:正如Armin所解释的那样,并非所有列表都相同,我们可以看到,通过以下方式使用了哪种策略:

import __pypy__ 
print __pypy__.strategy(nums)
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,它是IntegerListStrategy在第二种情况下ObjectListStrategy.如果我们使用大整数值(例如2**100)代替,则会发生同样的情况None.

python performance pypy

7
推荐指数
1
解决办法
77
查看次数

NumPy:替代 `vectorize` 可以让我访问数组

我有这个代码:

output_array = np.vectorize(f, otypes='d')(input_array)
Run Code Online (Sandbox Code Playgroud)

我想用这段代码替换它,它应该给出相同的输出:

output_array = np.ndarray(input_array.shape, dtype='d')
for i, item in enumerate(input_array):
    output_array[i] = f(item)
Run Code Online (Sandbox Code Playgroud)

我想要第二个版本的原因是我可以output_array在一个单独的线程中开始迭代,同时计算它。(是的,我知道 GIL,那部分已经处理好了。)

不幸的for是,即使我没有在单独的线程上处理数据,循环也很慢。我在 CPython 和 PyPy3 上对它进行了基准测试,这是我的目标平台。在 CPython 上它比 慢 3 倍vectorize,在 PyPy3 上它比vectorize!慢 67 倍。

尽管 Numpy 文档说“vectorize提供该函数主要是为了方便,而不是为了性能。实现本质上是一个 for 循环。”

知道为什么我的实现很慢,以及如何快速实现仍然允许我output_array在完成之前使用?

python pypy numpy

6
推荐指数
1
解决办法
120
查看次数

将 PyPy 与诗歌结合使用

如何使用 PyPy (最好pypy3)而不是标准 python poetry

也就是说,应该存储什么pyproject.toml?还需要其他改变吗?

pypy python-poetry

6
推荐指数
1
解决办法
2538
查看次数

为什么 PyPy 中这个筛子的 0/1 比 False/True 快?

类似于为什么在 Python3 中 use True 比 use 1 慢,但我使用 pypy3 而不是使用 sum 函数。

def sieve_num(n):
    nums = [0] * n
    for i in range(2, n):
        if i * i >= n: break
        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_bool(n):
    nums = [False] * n
    for i in range(2, n):
        if i * i >= n: break
        if nums[i] == …
Run Code Online (Sandbox Code Playgroud)

python performance pypy

6
推荐指数
1
解决办法
160
查看次数

pypy中使用venv和pip的正确方法

我一直在使用 cpython,但我对 pypy 很陌生。

在cpython中,这就是我使用虚拟环境和pip的方式。

python3 -m venv venv
source venv/bin/activate
python3 -m pip install <package>
Run Code Online (Sandbox Code Playgroud)

我最近开始在一个项目中使用 pypy,并注意到以下内容有效。

pypy3 -m venv venv
source venv/bin/activate
pypy3 -m pip install <package>
Run Code Online (Sandbox Code Playgroud)

问题:

  • cpython venv/pip 和 pypy venv/pip 之间有什么区别吗?
  • 我可以使用 cpython 创建 venv,并将其与 pypy 一起使用,反之亦然吗?
  • 同样,我可以使用 cpython 的 pip 安装软件包,并从 pypy 解释器使用它们,反之亦然吗?
  • 我正在做的事情“正确”吗?或者如果我走这条路,我将来会遇到任何缺点/问题吗?

我更喜欢调用的原因python3 -m ...

  • venv 存在于 std 中。lib,所以我不必全局安装 virtualenv。
  • pip比使用and更明确pip3

参考:


编辑:
尝试在 cpython 和 venv 之间共享 venv 不起作用(事后看来似乎很明显)。仍然可以创建两个单独的 venv,例如 …

python pypy ubuntu-22.04

6
推荐指数
1
解决办法
820
查看次数

如何在双精度算术中正确舍入到最接近的整数

我必须使用 Python3(PyPy 实现)分析大量数据,其中我对相当大的浮点数进行一些操作,并且必须检查结果是否足够接近整数。

举个例子,假设我正在生成随机的数字对,并检查它们是否形成毕达哥拉斯三元组(是具有整数边的直角三角形的边):

from math import hypot
from pprint import pprint
from random import randrange
from time import time

def gen_rand_tuples(start, stop, amount):
    '''
    Generates random integer pairs and converts them to tuples of floats.
    '''
    for _ in range(amount):
        yield (float(randrange(start, stop)), float(randrange(start, stop)))

t0 = time()
## Results are those pairs that results in integer hypothenuses, or
## at least very close, to within 1e-12.
results = [t for t in gen_rand_tuples(1, 2**32, 10_000_000) if …
Run Code Online (Sandbox Code Playgroud)

python precision pypy floating-accuracy double-double-arithmetic

6
推荐指数
1
解决办法
213
查看次数