标签: pypy

为什么JIT代码比编译代码或解释代码消耗更多内存?

编译代码如C消耗很少的内存.

解释代码如Python消耗更多内存,这是可以理解的.

使用JIT,程序在运行时(有选择地)编译为机器代码.那么JIT的程序的内存消耗应该介于编译程序和解释程序之间吗?

相反,JIT的程序(例如PyPy)消耗的内存比等效的解释程序(例如Python)多几倍.为什么?

compiler-construction jit programming-languages pypy

7
推荐指数
2
解决办法
1771
查看次数

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

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

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

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

c python sockets multithreading pypy

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

Unicode,正则表达式和PyPy

我编写了一个程序来为Python正则表达式添加(有限的)unicode支持,虽然它在CPython 2.5.2上工作正常,但它不适用于PyPy(1.5.0-alpha0 1.8.0,实现Python 2.7.1 2.7.2),两者都运行在Windows XP上(编辑:如评论中所示,@ dbaupp可以在Linux上正常运行).我不知道为什么,但我怀疑它与我对u"和的使用有关ur".完整的源代码在这里,相关的位是:

# -*- coding:utf-8 -*-
import re

# Regexps to match characters in the BMP according to their Unicode category.
# Extracted from Unicode specification, version 5.0.0, source:
# http://unicode.org/versions/Unicode5.0.0/
unicode_categories = {
    ur'Pi':ur'[\u00ab\u2018\u201b\u201c\u201f\u2039\u2e02\u2e04\u2e09\u2e0c\u2e1c]',
    ur'Sk':ur'[\u005e\u0060\u00a8\u00af\u00b4\u00b8\u02c2-\u02c5\u02d2-\u02df\u02...',
    ur'Sm':ur'[\u002b\u003c-\u003e\u007c\u007e\u00ac\u00b1\u00d7\u00f7\u03f6\u204...',
    ...
    ur'Pf':ur'[\u00bb\u2019\u201d\u203a\u2e03\u2e05\u2e0a\u2e0d\u2e1d]',
    ur'Me':ur'[\u0488\u0489\u06de\u20dd-\u20e0\u20e2-\u20e4]',
    ur'Mc':ur'[\u0903\u093e-\u0940\u0949-\u094c\u0982\u0983\u09be-\u09c0\u09c7\u0...',
}

def hack_regexp(regexp_string):
    for (k,v) in unicode_categories.items():
        regexp_string = regexp_string.replace((ur'\p{%s}' % k),v)
    return regexp_string

def regex(regexp_string,flags=0):
    """Shortcut for re.compile that also translates and …
Run Code Online (Sandbox Code Playgroud)

python regex string unicode pypy

7
推荐指数
2
解决办法
745
查看次数

用于编译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内存分析器?

我可以使用哪些工具来监控PyPy的内存消耗?如果该工具可以移植到各种Python解释器(CPython和PyPy)和版本(2.6到3.3),那就更好了.

profiler memory-management pypy

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

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
查看次数

与 CPython 相比,PyPy 大内存使用量

我用python解决了SPOJ的大输入测试问题,遇到了一个很奇怪的现象。我 使用 PyPy 和 Python 2提交了相同的代码。结果如下所示:

spoj 大输入测试

正如预期的那样,与 CPython 相比,使用 PyPy 的代码运行速度要快得多。但与此同时,内存使用量增加了惊人的 7 倍!我在网上进行了搜索,但找不到任何证据表明 PyPy 的内存使用量远远超过 CPython。有人可以解释一下内存使用量的巨大差异吗?

我也考虑过这可能是因为我的代码。因此,我在下面发布了我的代码:

import io, sys, atexit, os
sys.stdout = io.BytesIO()
atexit.register(lambda: sys.__stdout__.write(sys.stdout.getvalue()))
sys.stdin = io.BytesIO(sys.stdin.read())
raw_input = lambda: sys.stdin.readline().rstrip()

line = list(map(int,raw_input().split()))
num, k = line
ans = 0

for i in xrange(0,num):
    if int(raw_input())%k == 0:
        ans += 1;

print(ans) 
Run Code Online (Sandbox Code Playgroud)

有人可以建议我吗?

python io pypy cpython

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

Python 中的快速 GUID

我用 Python 开发了一个性能关键且 CPU 密集型的应用程序。为了达到可接受的性能,我使用 PyPy 和使用 os.fork 生成的多个进程。总的来说,我现在对接近编译语言的性能感到满意。但我最初使用的时候必须生成很多 GUID:

\n\n
import uuid\nprint(str(uuid.uuid4()))\n
Run Code Online (Sandbox Code Playgroud)\n\n

生成 UUID。但分析显示,UUID 生成约占总运行时间的 20%。这似乎是由于对os.urandom()in的调用uuid.uuid4()在某些系统(包括 OS\xc2\xa0X)上似乎很慢。然后我替换os.urandom()random.getrandbits()

\n\n
 import random\n str(UUID(int=random.getrandbits(128), version=4))\n
Run Code Online (Sandbox Code Playgroud)\n\n

这很快。但现在事实证明我的并行运行工作进程大量生成重复的 GUID。

\n\n

我怀疑 python 的伪数生成器是用当前时间作为种子的,这就是为什么不同的进程会生成相同的随机数。我能想到的一种可能的修复方法是将进程 ID 包含到数字生成器的种子中。但由于我不太确定 uuid 和随机包是如何在内部构建的,所以我不确定这是否足以防止冲突。我发现了一些作为 c 扩展编写的替代 UUID 实现,但由于 PyPy 我无法使用它们。

\n\n

由于某些库的原因,我只在这个项目中使用 python,而且我在 python 中编码的经验很少。

\n\n

更新:

\n\n

现在我已经seed(SystemRandom().getrandbits(128))在分叉后添加了。因此使用 /dev/urandom 播种 PRNG。到目前为止,这似乎运作良好。

\n\n

我喜欢 rossum 提出的用主进程 RNG 为子进程播种的想法。但现在想起来,我想使用操作系统的 RNG 来播种 RNG 应该更安全。特别是,因为我的应用程序还分布在多个节点上运行。恕我直言,用 mac 地址和时间戳播种初始 RNG,然后使用 rossums 提案应该也可行。

\n

random pypy guid multiprocessing python-3.x

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

When/Where does PyPy produce machine code?

I have skimmed through the PyPy implementation details and went through the source code as well, but PyPy's execution path is still not totally clear to me.

Sometimes Bytecode is produced, sometimes it is skipped for immediate machine-code compiling (interpreter level/app level code), But I can't figure out when and where exactly is the machine code produced, to be handed to the OS for binary execution through low-level instructions (RAM/CPU).

I managed to get that straight in the case of …

python pypy

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