标签: cpython

在Google App Engine中导入C python模块

我正在使用Python在Google应用引擎上开发应用程序.我想使用Python的editdist功能,因此我在我的程序中导入editdist C python模块,但它显示模块editdist不存在.

当我为我的本地应用程序导入editdist时它工作正常但不适用于Google应用程序引擎应用程序.

有谁能建议我导入这个模块的方法?

import google-app-engine cpython

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

Python:os.mkdir的代码在哪里?

我一直在浏览os模块的代码(只是为了清楚,我正在查看文件/usr/lib/python2.7/os.py),我一直在努力寻找代码mkdir函数.据我所知,它来自'posix'模块,它是一个内置函数,与范围或最大值相同:

>>> import posix
>>> posix.mkdir
<built-in function mkdir>
>>> max
<built-in function max>
Run Code Online (Sandbox Code Playgroud)

我猜这些代码是用C语言编写的,python解释器知道在哪里找到它们.有人可以解释,或指向一些资源,这些内置函数的编写方式和位置以及它们如何与解释器集成?

谢谢!

python cpython python-2.7

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

误导性的Python错误消息

如果我有一个文件 python_error_msg.py

x = [e for e in range(x)
x+=1
Run Code Online (Sandbox Code Playgroud)

$ python3 python_error_msg.py
Run Code Online (Sandbox Code Playgroud)

缺少的括号会出现以下错误:

  File "python_error_msg.py", line 2
    x+=1
    ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我的错误在于忘记]列表理解.这是可以做得更好的东西,还是Python语法如何工作的深层次问题?

另外,在哪里可以查看 代码库 以了解错误报告在Python中的工作原理?

python cpython syntax-error

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

python3中f2py的Makefile

为了在 python2 中使用 f2py 构建扩展模块,我一直在使用类似于以下内容的 Makefile:

default: fortran_lib.so

%.so::  %.f90
    f2py -c -m $* $<
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里还有一个虚拟fortran_lib.f90文件

subroutine square(d)
implicit none
!f2py intent(inout) d
integer, intent(inout)  ::  d

d = d*d
end subroutine square
Run Code Online (Sandbox Code Playgroud)

这曾经工作正常,make只会产生fortran_lib.so.

现在我也想支持 python3,但是在使用时f2py3make会生成版本号fortran_lib.cpython-35m-x86_64-linux-gnu.so(在我的特定设置中)。

由于这与指定的目标名称不同,make因此无法识别目标已经创建。因此,每次运行时它都会重新制作目标make

我如何解决这个问题(无需对版本进行硬编码)?

  • 我可以告诉 f2py3 关闭版本控制吗?
  • 我可以以某种方式解决 Makefile 中的版本控制吗?
  • 还是我被迫切换到其他工具来构建扩展模块(distutils,...)?

makefile cpython f2py python-3.x

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

如何在CPython中优化字符串排序?

我有这个代码是故意不符合要求的:

def suffix_array_alternative_naive(s):
    return [rank for suffix, rank in sorted((s[i:], i) for i in range(len(s)))]

from random import randint

constant_string = lambda length: 'a' * length
random_string = lambda length: ''.join(chr(randint(0, 255)) for _ in range(length))

length = 10000
s1 = constant_string(length)
s2 = random_string(length)

from time import time

for s in [s1, s2]:
    d = time()
    for _ in range(10):
        suffix_array_alternative_naive(s)
    print(time()-d)
Run Code Online (Sandbox Code Playgroud)
  • 使用pypy3: 2.0367980003356934 1.9366297721862793
  • 使用python3: 0.48073387145996094 0.5416769981384277 如果我尝试使用length = 100000和一个循环:

  • pypy3: 48.4867467880249 35.002175092697144

  • Python3 4.402702808380127 4.469300031661987

通常,常量字符串应该更长,以便在它们之间进行比较,因为你必须完全读取它们,而随机字符串应该很容易避免后缀前缀之间的冲突.因此,pypy3的结果是合乎逻辑的.

为什么它不像CPython那样工作?

python cpython

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

在 C 扩展中返回多个输出?

Python 允许使用逗号作为分隔值返回多个结果。

在开发用C语言编写的CPython扩展时,是否有可能获得相同的结果?如何?

我正在开发一个 CPython 扩展来替换现有的 Python 代码来对性能进行一些测试,我更喜欢使用相同的界面来不更改现有的代码库。

我正在使用 Python 3.6。

c python cpython python-3.x

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

为什么莳萝慢?

来自https://github.com/uqfoundation/dill/blob/master/dill/dill.py#L43

from pickle import _Pickler as StockPickler, Unpickler as StockUnpickler

这意味着 dill 继承自pickle._Pickler,它是一个纯 Python实现。然而,_pickle.Pickler是 pickle 的替代实现,并且是一个更快的版本。为什么莳萝不从它延伸出来?

python cpython pickle dill python-3.6

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

将 .py 文件转换为 .pyd 文件

经过大量搜索无法找到合适的解决方案后,我有我的 python 文件“Main.py”。我想要它的 .pyd 文件,即 Main.pyd。我尝试过使用 Cpython 的方法,即首先我已将“Main.py”文件转换为“Main.c”,但随后无法将“Main.c”转换为“Main.pyd”,而且方法非常困难。我可以吗有一个简单的方法将“Main.py”转换为“Main.pyd”吗?

dll cpython pyd python-3.x

1
推荐指数
1
解决办法
2万
查看次数

CPython 中变量赋值是如何实现的?

我知道 Python 中的变量实际上只是某些底层对象的引用/指针。由于它们是指针,我猜它们以某种方式“存储”或以其他方式与它们引用的对象的地址相关联。

这样的“地址存储”可能发生在 CPython 实现的较低级别。但我对 C 的了解还不足以从源代码中推断出这一点,我也不知道从源代码中的哪里开始查找。

所以,我的问题是:

在 CPython 的实现中,对象地址如何存储在指向它们的变量中,或者如何与指向它们的变量关联?

c python cpython python-3.x python-internals

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

为什么 sys.argv 在 Python 退出时设置为 None?

请考虑以下脚本:

import sys


class A:
    def __init__(self):
        print('Constructing A')
        print(sys.argv)
        print(sys.meta_path)
        print(sys.float_info)

    def __del__(self):
        print('Destructing A')
        print(sys.argv)
        print(sys.meta_path)
        print(sys.float_info)


x = A()
Run Code Online (Sandbox Code Playgroud)

我期望从运行这个代码将打印相同sys.argv__init__()__del__()阶级的A。但是,输出与预期不同:

Constructing A
['test.py']
[<class '_frozen_importlib.BuiltinImporter'>, ...]
sys.float_info(max=1.7976931348623157e+308, ...)

Destructing A
None
None
sys.float_info(max=1.7976931348623157e+308, ...)
Run Code Online (Sandbox Code Playgroud)

我的问题:为什么会这样?它是一个实现细节CPython的设置sys.argv,以None在关机,或者是它的文档中描述的地方?为什么 Python(显式地或通过 GC)首先从sys(likeargvmeta_path) 中删除一些对象,同时保留其他对象 (like float_info)?

我在 GNU/Linux 上使用 CPython 3.8.5。

python cpython internals

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