标签: cpython

反正有没有清除python字节码缓存?

我正在运行的每个单元测试都是将python代码写入文件,然后将其作为模块导入.问题是代码更改但进一步的import语句不会修改模块.

我认为我需要的是一种方法来强制重新加载模块或清除内部字节码缓存.有任何想法吗?

谢谢!

python cpython

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

Python:pickle派生的str对象

运行:

import pickle

class Foo(str):
    def __new__(cls, s, bar):
        self = super(Foo, cls).__new__(cls, s)
        self.bar = bar
        return self

with open('foo.pkl', 'wb') as w:
    x = pickle.dump(Foo('', 1), w, pickle.HIGHEST_PROTOCOL)

with open('foo.pkl', 'rb') as w:
    x = pickle.load(w)
Run Code Online (Sandbox Code Playgroud)

此例外的结果:

Traceback (most recent call last):
  File "pkl.py", line 13, in <module>
    x = pickle.load(w)
  File "/usr/lib/python2.7/pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "/usr/lib/python2.7/pickle.py", line 858, in load
    dispatch[key](self)
  File "/usr/lib/python2.7/pickle.py", line 1083, in load_newobj
    obj = cls.__new__(cls, *args)
TypeError: __new__() …
Run Code Online (Sandbox Code Playgroud)

python string cpython pickle

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

如何在两个不同的内存位置创建 int 1?

我想向某人展示如何使用is而不是==比较整数会失败。我认为这会起作用,但它没有:

>>> import copy
>>> x = 1
>>> y = copy.deepcopy(x)
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)

对于更大的整数,我可以很容易地做到这一点:

>>> x = 500
>>> y = 500
>>> x is y
False
Run Code Online (Sandbox Code Playgroud)

我如何用较小的整数来演示相同的事情,这些整数通常可能用于 python 中的类似枚举的目的?

python cpython

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

Python:关于Python函数实现的信息

我发现了CPython实现,Python对象的结构和Python字节码.

玩函数,我发现空函数的堆栈大小为1.
为什么?声明什么var占用堆栈空间?


空功能:

def empty():
    pass
Run Code Online (Sandbox Code Playgroud)

功能信息:

>>> dis.show_code(empty)

Name:                empty
Filename:            <pyshell#27>
Argument count:      0
Kw-only arguments:   0
Stack size:          1
Number of locals:    0
Variable names:
Constants:
    0: None

Names:
Flags:               OPTIMIZED, NEWLOCALS, NOFREE
First line number:   1
Free variables:
Cell variables:
Run Code Online (Sandbox Code Playgroud)



与当地人的作用:

def withlocals():
    first = 0
    second = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

功能信息:

>>> dis.show_code(withlocals)

Name:                withlocals
Filename:            <pyshell#27>
Argument count:      0
Kw-only arguments:   0
Stack size:          3
Number of locals:    2
Variable names:
    0: …
Run Code Online (Sandbox Code Playgroud)

python cpython object python-3.x python-internals

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

为什么Python的CONTINUE_LOOP允许外部循环,而BREAK_LOOP不允许?

我注意到Python的字节码在这里有一个有趣的特点.

CONTINUE_LOOP操作码取入一个target将表示循环的指令继续执行,这是一个参数FOR_ITER的指令.

BREAK_LOOP操作码,但是,并没有做到这一点.它只会突破当前(最里面)的循环.

这背后的原因是什么?为什么它可能continue而不是break外循环?

python loops bytecode cpython python-internals

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

在CPython 3.6中获取字典中的第一个和第二个值

既然字典是在python 3.6中排序的,那么必须有一种方法可以只用两行来获取字典的第一个和第二个值.现在,我必须用7行来完成这个:

for key, value in class_sent.items():
    i += 1
    if i == 1:
        first_sent = value
    elif i == 2:
        second_sent = value
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

first_sent = next(iter(class_sent))
    second_sent = next(iter(class_sent))
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,second_sent等于first_sent.如果有人知道如何在尽可能少的行中获取字典中的第一个和第二个值,我会非常感激.

python dictionary cpython python-3.6

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

'is'运算符不处理具有相同标识的对象

我在跑:

Python 2.7.8 (default, Oct  6 2017, 09:25:50)
GCC 4.1.2 20070626 (Red Hat 4.1.2-14) on Linux 2
Run Code Online (Sandbox Code Playgroud)

根据文件:

运营商isis not测试对象标识:x is yTrue当且仅当xy相同的对象.

为了获得对象的身份,我们可以使用该id功能.


如果我们打开一个新的REPL,我们可以看到它300-6具有相同的标识(在CPython上,这意味着它们都引用相同的内存地址):

>>> id(300)
94766593705400
>>> id(-6)
94766593705400
Run Code Online (Sandbox Code Playgroud)

请注意,实际值可能因执行而异,但它们始终相等.

然而,做300 is -6收益率False:

>>> 300 is -6
False
Run Code Online (Sandbox Code Playgroud)

我有一些问题:

  • 为什么(以及如何)做300-6分享相同的身份? …

python cpython python-2.x python-2.7

4
推荐指数
2
解决办法
102
查看次数

将多个Python子解释器嵌入到C程序中

我正在编写一个生成多个C线程的C程序,每个线程一个Python子解释器。子解释器不共享任何可变的Python变量,它们彼此隔离。(它们确实对从C程序的main()函数公开的公共PyObject(不可变)具有只读访问权限)。

在子解释器之间不共享GIL的情况下,是否可以在Python 3.7或3.8中实现?

这是我一直在尝试的伪代码:

void *spawnInterpreter(void* p) {
    …
    PyThreadState* save_tstate = PyThreadState_Swap(NULL);
    PyThreadState* tstate = Py_NewInterpreter();
    PyThreadState_Swap(save_tstate);

    //do some Python work (with variables that are NOT shared with other thread’s sub-interpreter
    PyRun_SimpleString( . . .);
    . . . 
}


int main() {
...
    pthread_create(&thread1, NULL, spawnInterpreter,  “in1”);
    pthread_create(&thread2, NULL, spawnInterpreter, "in2");
...
}
Run Code Online (Sandbox Code Playgroud)

我可以使它在3.6中工作(无需获取GIL或PyThreadState在C线程中进行管理),但是在Python 3.7中,我得到了:

[New Thread 0x7ffff5f78700 (LWP 16392)]
Fatal Python error: drop_gil: GIL is not locked
Run Code Online (Sandbox Code Playgroud)

c python cpython python-c-api

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

在CPython源代码中定义math_sin函数?

我正在研究CPython的代码库。

我想知道在哪里可以找到表中math_sin显示的函数的定义:mathmethodsmathmodule.c

{"sin",             math_sin,       METH_O,         math_sin_doc}
Run Code Online (Sandbox Code Playgroud)

这样做grep "math_sin" -wr的主要cpython文件夹中唯一的回报:

Modules/mathmodule.c:    {"sin",             math_sin,       METH_O,         math_sin_doc},
Run Code Online (Sandbox Code Playgroud)

在哪里可以找到此函数的定义?

python cpython python-internals

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

为什么在python for循环中计算临时变量会占用大量内存?

以下两个代码是等效的,但是第一个大约占用700M内存,后一个仅占用约100M内存(通过Windows任务管理器)。这里会发生什么?

def a():
    lst = []
    for i in range(10**7):
        t = "a"
        t = t * 2
        lst.append(t)
    return lst

_ = a()
Run Code Online (Sandbox Code Playgroud)
def a():
    lst = []
    for i in range(10**7):
        t = "a" * 2
        lst.append(t)
    return lst

_ = a()
Run Code Online (Sandbox Code Playgroud)

python cpython

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