标签: cpython

在Python列表中存储Python对象与固定长度的Numpy数组

在做一些生物信息学工作时,我一直在思考将对象实例存储在Numpy数组而不是Python列表中的后果,但在我所做的所有测试中,性能在每个实例中都更糟.我正在使用CPython.有谁知道原因?

特别:

  • 使用固定长度数组numpy.ndarray(dtype=object)与常规Python列表有什么性能影响?我执行的初始测试表明,访问Numpy数组元素比通过Python列表迭代更慢,尤其是在使用对象方法时.
  • 为什么使用列表解析来实例化对象更快,例如[ X() for i in range(n) ]代替numpy.empty(size=n, dtype=object)
  • 每个的内存开销是多少?我无法测试这个.我的课程广泛使用__slots__,如果这有任何影响.

python performance numpy cpython python-3.x

10
推荐指数
1
解决办法
3563
查看次数

Python 3.5 vs. 3.6使得"map"与理解相比变慢的原因

我有时会使用map如果有一个用C语言编写的函数/方法来获得更多的性能.然而,我最近重新审视了一些基准测试,并注意到相对性能(与类似的列表理解相比)在Python 3.5和3.6之间发生了巨大变化.

这不是实际的代码,只是一个说明差异的最小样本:

import random

lst = [random.randint(0, 10) for _ in range(100000)]
assert list(map((5).__lt__, lst)) == [5 < i for i in lst]
%timeit list(map((5).__lt__, lst))
%timeit [5 < i for i in lst]
Run Code Online (Sandbox Code Playgroud)

我意识到使用它并不是一个好主意,(5).__lt__但我现在无法想出一个有用的例子.

Python-3.5的时间安排支持这种map方法:

15.1 ms ± 5.64 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
16.7 ms ± 35.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Run Code Online (Sandbox Code Playgroud)

虽然Python-3.6时序实际上表明理解更快:

17.9 ms …
Run Code Online (Sandbox Code Playgroud)

python performance cpython python-3.5 python-3.6

10
推荐指数
2
解决办法
859
查看次数

为 python 模块创建 golang 绑定

我想为现有的(第三方)Python 模块编写 golang 绑定。目的是想使用Golang中Python模块提供的API。

我已经找到了 Python 的 C API 的 golang 绑定(py3 的go-python3和 py2 的go-python),但我仍然没有弄清楚如何将相对复杂的 Python 模块转换为 Golang(即如何处理类型安全在python中寻找不安全的输入和返回等)。

什么是好的方法?该领域是否有任何预先存在的工具?有没有关于 Python 代码的 Golang 绑定的好例子?(我找不到很多 tbh)。

python binding cpython go

10
推荐指数
1
解决办法
3075
查看次数

CPython与Jython vs. IronPython进行跨平台GUI开发

我正在考虑为数字硬件设计制作某种实验性IDE.所以我无法决定选择巫婆平台.

我将使用带语法高亮的文本编辑器,一些矢量图形和许多选项卡式窗口.

我的目标:1.使用尽可能少的自定义组件来使用GUI.2.使其尽可能跨平台

(我已经知道CPython和Jython是跨平台友好的,但是IronPython + Mono呢?)

所以 - 问题是关于GUI - 我应该选择什么?

python user-interface ironpython jython cpython

9
推荐指数
3
解决办法
6141
查看次数

为什么向上和向下箭头命令在Python命令行解释器中不起作用?

我在Linux上使用VT100终端仿真器.在bash中,向上和向下箭头滚动执行最后的命令; 他们按预期工作.

在Python命令行解释器中不解释上一个(向上箭头)和下一个(向下箭头)命令.我需要什么样的键映射来完成这项工作?

谢谢.

python linux cpython

9
推荐指数
2
解决办法
5117
查看次数

内置"in"运算符的Python源代码

我试图in在(C)Python源代码中找到内置运算符的实现.我在内置函数源代码bltinmodule.c中搜索过,但是找不到这个运算符的实现.我在哪里可以找到这个实现?

我的目标是通过扩展此搜索的不同C实现来改进Python中的子字符串搜索,尽管我不确定Python是否已经使用了我的想法.

c python string cpython python-internals

9
推荐指数
1
解决办法
2037
查看次数

从C线程调用Python代码

当从C(或C++)线程调用Python代码时,我对如何确保线程安全性感到非常困惑.

Python文档似乎是说,通常的成语这样做是:

PyGILState_STATE gstate;
gstate = PyGILState_Ensure();

/* Perform Python actions here. */
result = CallSomeFunction();
/* evaluate result or handle exception */

/* Release the thread. No Python API allowed beyond this point. */
PyGILState_Release(gstate);
Run Code Online (Sandbox Code Playgroud)

事实上,这个stackoverflow答案似乎也证实了这一点.但是一位评论员(声誉很高)却说不然.评论者说你应该使用PyEval_RestoreThread()/ PyEval_SaveThread().

文档似乎证实了这一点:

PyThreadState* PyEval_SaveThread()

Release the global interpreter lock (if it has been created and 
thread support is enabled) and reset the thread state to NULL, 
returning the previous thread state (which is not NULL). If …
Run Code Online (Sandbox Code Playgroud)

c python multithreading cpython python-3.x

9
推荐指数
1
解决办法
724
查看次数

为什么CPython有一个"POP_BLOCK"操作码?

跟踪Python字节码中的块的目的是什么?

这里的文档提到:

...每帧,有一堆块,表示嵌套循环,try语句等.

但实际上它们似乎并不需要实际执行循环.例如,玩弄REPL我看到:

>>> def foo():
...   while True:
...     print('hi')
... 
>>> for inst in list(dis.get_instructions(foo)): print(inst)
... 
Instruction(opname='SETUP_LOOP', opcode=120, arg=12, argval=14, argrepr='to 14', offset=0, starts_line=2, is_jump_target=False)
Instruction(opname='LOAD_GLOBAL', opcode=116, arg=0, argval='print', argrepr='print', offset=2, starts_line=3, is_jump_target=True)
Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval='hi', argrepr="'hi'", offset=4, starts_line=None, is_jump_target=False)
Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=6, starts_line=None, is_jump_target=False)
Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=8, starts_line=None, is_jump_target=False)
Instruction(opname='JUMP_ABSOLUTE', opcode=113, arg=2, argval=2, argrepr='', offset=10, starts_line=None, is_jump_target=False)
Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=12, starts_line=None, is_jump_target=False)
Instruction(opname='LOAD_CONST', opcode=100, …
Run Code Online (Sandbox Code Playgroud)

python bytecode cpython

9
推荐指数
1
解决办法
288
查看次数

嵌入式环境下Python home和sys.prefix的正确设置

现在的情况

我将 Python 嵌入到我的 C++ 应用程序中。该应用程序被安装到Mac系统(在Windows上常见的应用场所C:\Program Files/Applications/...),这需要管理员权限才能进行修改,这些目录。我的应用程序还附带了自己的 Python 安装。以下是包装结构的示例:

C:\Program Files\Foo\foo.exe
C:\Program Files\Foo\Lib
C:\Program Files\Foo\DLLs
C:\Program Files\Foo\python.exe
Run Code Online (Sandbox Code Playgroud)

该程序还设置了一个额外的用户特定目录,该目录不需要任何权限,位于sys.path

C:\Users\username\AppData\Roaming\Foo\python\libs
Run Code Online (Sandbox Code Playgroud)

问题

在初始化过程中我叫PySet_PathPy_SetPythonHome我一套sys.prefixProgram Files\Foo所要求的文件

如果用户pip通过 pip安装或模块,它最终会出现在这个应用程序目录中,这当然需要提升的权限。但是pip install something --user需要找到一个用户友好的安装目录(在我的例子中是 AppData 目录)。

我的问题是,我应该设置哪些值和组合来使用--user?是否建议将 Python 主目录设置为 AppData 目录和sys.prefixProgram Files 目录?

因为,这意味着用户可以--user用来控制某些文件的安装位置

C:\Program Files\Foo\python.exe -m pip install xyz --user
would go into the user directory

C:\Program Files\Foo\python.exe …
Run Code Online (Sandbox Code Playgroud)

python cpython

9
推荐指数
1
解决办法
643
查看次数

Python中的“0是0”总是“真”吗?

Python 3.8(或 CPython 3.8?)添加了警告

SyntaxWarning: "is" with a literal. Did you mean "=="?
Run Code Online (Sandbox Code Playgroud)

对于代码0 is 0

我理解的警告,我知道之间的区别is==

但是,我也知道 CPython 会缓存小整数的对象并在其他情况下共享它。(出于好奇,我再次检查了代码标头)。小整数被缓存在tstate->interp->small_ints. 中 01并且更加特殊,并且全局存储在_PyLong_Zero和 中_PyLong_One。所有新创建的ints 都是 viaPyLong_FromLong并且首先检查它是否是一个小整数整数和缓存。)

鉴于这种背景,如果你知道你有一个int对象,你可以说支票x is 0应该是安全的,对吧?此外,您可以推导出0 is 0应该始终是True,对吗?或者这是 CPython 的一个实现细节而其他解释器没有遵循这个?哪个解释器不遵循这个?

尽管这个更通用的问题(我只是好奇),请考虑这个更具体的(示例)代码:

def sum1a(*args):
    y = 0
    for x in args:
        if y is 0:
            y = x …
Run Code Online (Sandbox Code Playgroud)

python cpython python-3.x python-internals

9
推荐指数
1
解决办法
286
查看次数