与手写的C相比,pypy能否快速处理线程和套接字?与普通的蟒蛇相比?
我只是尝试一下,但有问题的python代码是为一小群计算机编写的,我不是管理员.我在这里问,因为我的谷歌尝试只提供了与cython,unladen swallow等的比较,如果这不太可行,我不想让管理员知道它.
我实际上并不需要pypy来擅长C; 我正在寻找使用它,因为现在解释器的开销完全掩盖了我想要计算的计算.我只需要pypy让我在手写的C附近.
我对python很新,但我想通过制作游戏来学习它,而pygame似乎是最好的选择.由于PyPy是python的最快实现(我认为),我决定使用那个.但我不知道如何让这两个人一起工作.
我在窗户上.
如果有人愿意一步一步地告诉我我需要做什么,我会非常感激.
到目前为止,我已经安装(解压缩到文件夹)PyPy,将pypy.exe设置为打开.py文件的默认设置,安装Pygame并尝试运行其中一个示例.py文件.我在文件中的第一个导入行中收到"模块pygame not found"错误.
我正在尝试将使用Pythonic语义编写的代码自动编译/转换为本机和快速Javascript代码.
有什么工具可以做到这一点,可以像Java等一样提供良好的调试支持?
有没有人这样做过?
为什么?
我正在尝试用复杂的主循环,时间轴,一些物理模拟和一些复杂的交互来编写一些可视化代码.IE:它是一个实际的CPU绑定问题.
使用Javascript编写并在其浏览器环境中进行测试比在一个体面的IDE中运行的Java,.NET或Python更难调试.但是对于使用复杂的客户端代码进行实际的大规模Web开发,至少需要编译为Javascript,如果不直接写入它.
背景:最新进展
Emscripten允许将C/C++编译为Javascript,由于ArrayBuffer的类型化阵列支持和新的浏览器JS引擎,可以在浏览器中提高效率,因为ASM.js和LLJS利用了Mozilla最近的速度改进(其他供应商可能很快跟随).
Altjs.org有一个Javascript holternaltives的清单,但是还没有专注于最近的速度改进或特别好的语义,但它已成为人们用更好的工具为浏览器编码的常见地方.特别是Emscripten有很多令人惊叹的演示.
已考虑的可能选择:
附加限制:
"构建指令表的这个过程应该非常有趣.它不需要成为苦差事的真正危险,因为任何非常机械的过程都可能被转移到机器本身." - 艾伦·图灵,1946年
(这是PyPy统计分析器的后续)
我在PyPy下运行一些Python代码,并希望对其进行优化.
在Python中,我会使用statprof或lineprofiler知道哪些确切的行导致减速并尝试解决它们.但是在PyPy中,两个工具都没有真正报告合理的结果,因为PyPy可能会优化掉某些行.我也不愿意使用,cProfile因为我发现很难提炼报告功能的哪一部分是瓶颈.
有没有人有关于如何进行的一些提示?也许是另一个在PyPy下运行良好的分析器?一般来说,如何为PyPy优化Python代码?
因为我想要实现的算法使用索引,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使用.
所以我的问题是双重的:
None不是一个好主意,但为什么呢?None-approach 的安全性并保持性能?编辑:正如Armin所解释的那样,并非所有列表都相同,我们可以看到,通过以下方式使用了哪种策略:
import __pypy__
print __pypy__.strategy(nums)
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,它是IntegerListStrategy在第二种情况下ObjectListStrategy.如果我们使用大整数值(例如2**100)代替,则会发生同样的情况None.
我有这个代码:
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在完成之前使用?
如何使用 PyPy (最好pypy3)而不是标准 python poetry?
也就是说,应该存储什么pyproject.toml?还需要其他改变吗?
类似于为什么在 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) 我一直在使用 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)
问题:
我更喜欢调用的原因python3 -m ...:
pip比使用and更明确pip3。参考:
编辑:
尝试在 cpython 和 venv 之间共享 venv 不起作用(事后看来似乎很明显)。仍然可以创建两个单独的 venv,例如 …
我必须使用 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
pypy ×10
python ×9
performance ×2
c ×1
firefox ×1
javascript ×1
llvm ×1
numpy ×1
optimization ×1
precision ×1
profiling ×1
pygame ×1
sockets ×1
ubuntu-22.04 ×1