我正在使用Python在Google应用引擎上开发应用程序.我想使用Python的editdist功能,因此我在我的程序中导入editdist C python模块,但它显示模块editdist不存在.
当我为我的本地应用程序导入editdist时它工作正常但不适用于Google应用程序引擎应用程序.
有谁能建议我导入这个模块的方法?
我一直在浏览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_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中的工作原理?
为了在 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,但是在使用时f2py3,make会生成版本号fortran_lib.cpython-35m-x86_64-linux-gnu.so(在我的特定设置中)。
由于这与指定的目标名称不同,make因此无法识别目标已经创建。因此,每次运行时它都会重新制作目标make。
我如何解决这个问题(无需对版本进行硬编码)?
distutils,...)?我有这个代码是故意不符合要求的:
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)
2.0367980003356934
1.9366297721862793
使用python3:
0.48073387145996094
0.5416769981384277
如果我尝试使用length = 100000和一个循环:
pypy3:
48.4867467880249
35.002175092697144
4.402702808380127
4.469300031661987
通常,常量字符串应该更长,以便在它们之间进行比较,因为你必须完全读取它们,而随机字符串应该很容易避免后缀前缀之间的冲突.因此,pypy3的结果是合乎逻辑的.
为什么它不像CPython那样工作?
Python 允许使用逗号作为分隔值返回多个结果。
在开发用C语言编写的CPython扩展时,是否有可能获得相同的结果?如何?
我正在开发一个 CPython 扩展来替换现有的 Python 代码来对性能进行一些测试,我更喜欢使用相同的界面来不更改现有的代码库。
我正在使用 Python 3.6。
来自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 文件“Main.py”。我想要它的 .pyd 文件,即 Main.pyd。我尝试过使用 Cpython 的方法,即首先我已将“Main.py”文件转换为“Main.c”,但随后无法将“Main.c”转换为“Main.pyd”,而且方法非常困难。我可以吗有一个简单的方法将“Main.py”转换为“Main.pyd”吗?
我知道 Python 中的变量实际上只是某些底层对象的引用/指针。由于它们是指针,我猜它们以某种方式“存储”或以其他方式与它们引用的对象的地址相关联。
这样的“地址存储”可能发生在 CPython 实现的较低级别。但我对 C 的了解还不足以从源代码中推断出这一点,我也不知道从源代码中的哪里开始查找。
所以,我的问题是:
在 CPython 的实现中,对象地址如何存储在指向它们的变量中,或者如何与指向它们的变量关联?
请考虑以下脚本:
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(likeargv或meta_path) 中删除一些对象,同时保留其他对象 (like float_info)?
我在 GNU/Linux 上使用 CPython 3.8.5。
cpython ×10
python ×7
python-3.x ×4
c ×2
dill ×1
dll ×1
f2py ×1
import ×1
internals ×1
makefile ×1
pickle ×1
pyd ×1
python-2.7 ×1
python-3.6 ×1
syntax-error ×1