我在大学里做过几个关于 C 的项目,但从未以专业身份使用过它。
最近我开始通读 cpython 的源代码,下面的语法让我很困惑:github
什么是PyAPI_FUNC(int) PyToken_OneChar(int);函数名前的部分是什么意思?它是动态构造返回类型的包装函数吗?
在这种情况下,我什至不确定 Google 搜索什么!
我正在运行以下 python 代码
import numpy as np
import pydensecrf.densecrf as dcrf
import matplotlib.pyplot as plt
Run Code Online (Sandbox Code Playgroud)
这导致
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-4-cbaa174fb5e7> in <module>
1 import numpy as np
----> 2 import pydensecrf.densecrf as dcrf
3 import matplotlib.pyplot as plt
ModuleNotFoundError: No module named 'pydensecrf'
Run Code Online (Sandbox Code Playgroud)
我尝试安装: pip install pydensecrf 但每当我这样做时,我都会收到以下错误
C:\Users\Aparajita Das>pip install pydensecrf
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='pypi.org', port=443): Read timed out. (read timeout=15)")': /simple/pydensecrf/
Collecting pydensecrf
Using cached pydensecrf-1.0rc3.tar.gz (1.0 …Run Code Online (Sandbox Code Playgroud) 我正在摆弄字符串并遇到以下行为:
>>> import dis
>>> dis.dis('"abcdefgh" * 513')
1 0 LOAD_CONST 0 ('abcdefgh')
2 LOAD_CONST 1 (513)
4 BINARY_MULTIPLY
6 RETURN_VALUE
>>> dis.dis('"abcdefgh" * 512')
1 0 LOAD_CONST 0 ('abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh')
2 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,当我乘以 时"abcdefgh",512python 在编译阶段预先计算完整的字符串,但是当我将数字更改为513它时,它不再这样做,而是生成两个LOAD_CONST和 BINARY_MULTIPLY操作码(换句话说,python 不再预先计算编译阶段的结果)。有人可以解释这种行为的原因吗?
注意:我知道从代码的角度来看它工作得很好,但我很想知道这种行为的原因。
python cpython compiler-optimization python-3.x python-internals
我在玩弄sum函数并观察到以下行为。
情况1:
source = """
class A:
def __init__(self, a):
self.a = a
def __add__(self, other):
return self.a + other;
sum([*range(10000)], start=A(10))
"""
import timeit
print(timeit.timeit(stmt=source))
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用自定义类的实例作为函数start的参数sum。在我的系统中,对上面的代码进行基准测试大约需要几192.60747704200003秒钟的时间。
案例2:
source = """
class A:
def __init__(self, a):
self.a = a
def __add__(self, other):
return self.a + other;
sum([*range(10000)], start=10). <- Here
"""
import timeit
print(timeit.timeit(stmt=source))
Run Code Online (Sandbox Code Playgroud)
但如果我删除自定义类实例并int直接使用对象,则只需要111.48285191600007几秒钟。我很想知道这种速度差异的原因是什么?
我的系统信息:
>>> import platform
>>> platform.platform()
'macOS-12.5-arm64-arm-64bit'
>>> import sys
>>> sys.version
'3.11.0 …Run Code Online (Sandbox Code Playgroud) 例如,0 STORE_NAME 0 (sys)是指令的一部分import sys.该指令格式是否有任何文档?更重要的是,这种格式是Python的标准吗?还是具体实施?
sqlstring = 'INSERT INTO {}'
table = 'Product'
sqlstring.format(table)
Run Code Online (Sandbox Code Playgroud)
不会导致'INSERT INTO产品'但仍然'INSERT INTO {}'为什么会这样?
您可能已经注意到,CPython有时会存储相同的不可变对象的单个副本.
例如
>>> a = "hello"
>>> b = "hello"
>>> a is b
True
>>> a, b = 7734, 7734
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)
我认为是堆的散列似乎是在类型推断之后执行的
>>> a, b = 7734, 07734
>>> a is b
False
>>> a, b = 7734, 017066
>>> a is b
True
Run Code Online (Sandbox Code Playgroud)
有没有办法反省解释器并打印出这个假定的不可变对象堆?
我看到了建议(参见例如,在C中使用移位运算符进行乘法和除法实际上更快吗?),你不应该用移位运算符手动替换乘法,因为编译器必须自动执行,移位运算符会降低可读性.我写了一个简单的测试来检查这个:
import numpy as np
import time
array1 = np.random.randint(size=10 ** 6, low=0, high=10 ** 5)
array2 = np.zeros((10 ** 6,), dtype=np.int)
total = 0.0
for i in range(100):
start = time.clock()
for j in range(len(array2)):
array2[j] = array1[j] * 2
total += time.clock() - start
print("*2 time = " + str(round(total / 10, 5)) + " ms")
total = 0.0
for i in range(100):
start = time.clock()
for j in range(len(array2)):
array2[j] = array1[j] << 1
total …Run Code Online (Sandbox Code Playgroud) 我试图ThreadPoolExecutor在Windows 7上的Python 3.6中使用,似乎异常被忽略或停止了程序执行。示例代码:
#!/usr/bin/env python3
from time import sleep
from concurrent.futures import ThreadPoolExecutor
EXECUTOR = ThreadPoolExecutor(2)
def run_jobs():
EXECUTOR.submit(some_long_task1)
EXECUTOR.submit(some_long_task2, 'hello', 123)
return 'Two jobs was launched in background!'
def some_long_task1():
print("Task #1 started!")
for i in range(10000000):
j = i + 1
1/0
print("Task #1 is done!")
def some_long_task2(arg1, arg2):
print("Task #2 started with args: %s %s!" % (arg1, arg2))
for i in range(10000000):
j = i + 1
print("Task #2 is done!")
if __name__ == '__main__': …Run Code Online (Sandbox Code Playgroud) python cpython windows-7-x64 python-multithreading python-3.x
在Cpython实现中,当我们删除dict中的键时,Cpython会将对应的条目设置为虚拟条目,为什么是虚拟条目?我可以让ertry的价值为零吗?
我不擅长C,所以我在python中嘲笑它,接下来是我的python的实现代码:
class DictEntry:
def __init__(self):
self.key = None
self.value = None
self.hash = None
def __repr__(self):
return ' %s %s %s' % (self.key, self.hash, self.value)
class Hashtable:
def __init__(self):
self.size = 8
self.used = 0
self.mask = self.size - 1
self.pow2 = 3
self.entyies = [DictEntry() for _ in range(self.size)]
def insert(self, key, item):
hash_value = _hash(key)
_key = hash_value & (self.size - 1)
if not self.is_slot_empty(_key):
_key = self.next_slot(_key, hash_value)
entry = self.entyies[_key]
entry.key = _key
entry.hash = …Run Code Online (Sandbox Code Playgroud) cpython ×10
python ×9
python-3.x ×6
c ×1
crf ×1
dictionary ×1
optimization ×1
python-3.11 ×1
python-3.2 ×1