标签: cpython

为什么Python的timeit()无休止地执行?

当尝试使用Python内置模块'timeit'时,如下所示:

timeit.Timer('print "hi"').timeit()
Run Code Online (Sandbox Code Playgroud)

它打印多行; 这是为什么?它不断印刷"喜":

hi
hi
hi
hi
...
Run Code Online (Sandbox Code Playgroud)

python cpython timeit

3
推荐指数
2
解决办法
679
查看次数

Python:方法listdir在哪里,因为模块os.py中没有"def listdir()"?

Python:我想知道这个方法listdir在哪里,因为他不在模块os.py中.在这个模块中没有一个方法:

def listdir ()
Run Code Online (Sandbox Code Playgroud)

python cpython listdir

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

Python中的堆栈是什么?

我们在Python中称之为"堆栈"是什么?它是CPython的C堆栈吗?我读到Python堆栈帧是在堆中分配的.但我认为堆栈的目标是...堆栈堆栈帧.那堆栈到底是做什么的?

python cpython python-internals

3
推荐指数
2
解决办法
385
查看次数

运行代码时,VS中的错误"**我们没有找到任何解释器**"

当我尝试在Visual Studio python中运行我的代码时,为什么会收到错误消息" 我们没有找到任何解释器 "?

cpython visual-studio python-2.7 python-3.x

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

为什么2个不同的python lambda具有相同的字节码?

我看到一些我不理解的行为.我认为python函数的字节码是为了产生结果而被执行的,但是在这里我有2个不同的lambda函数,它们具有相同的字节码,但显然做了不同的事情.怎么会这样?

a = lambda x: x+4
b = lambda y: y+3
print('a = ', a.__code__.co_code)
print('b = ', b.__code__.co_code)
print(a(1), b(1))
Run Code Online (Sandbox Code Playgroud)

生成此输出:

a =  b'|\x00\x00d\x01\x00\x17S'
b =  b'|\x00\x00d\x01\x00\x17S'
5 4
Run Code Online (Sandbox Code Playgroud)

python lambda cpython

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

Python的reverse()函数如何工作?

根据Python的文档,reversed()使用__getitem____len__if __reversed__未实现.

我遇到了一个奇怪的行为,但未能解释它:

>>> class A(dict):
...     pass
...
>>> reversed(A())
Traceback (most recent call last):
    ...
TypeError: 'A' object is not reversible

>>> class B(dict):
...     def __getitem__(self, key):
...         return super().__getitem__(key)
...     def __len__(self):
...         return super().__len__()
...
>>> reversed(B())
Traceback (most recent call last):
    ...
TypeError: 'B' object is not reversible

>>> class C:
...     def __getitem__(self, key):
...         return "item"
...     def __len__(self):
...         return 1
... …
Run Code Online (Sandbox Code Playgroud)

python cpython python-internals

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

将NaN添加到集合时导致行为不一致的原因

Python的集合与NaNs(现在直播)的行为令人费解(至少对我而言):

>>> float('nan') in {float('nan')}    # example 1
False
>>> nan = float('nan')                # example 2
>>> nan in {nan}
True
Run Code Online (Sandbox Code Playgroud)

起初,我错误地认为,这是==-operator 的行为,但显然不是这种情况,因为两种情况都False按预期产生(这里是实时的):

>>> float('nan') == float('nan') 
False
>>> nan = float('nan')
>>> nan == nan
False
Run Code Online (Sandbox Code Playgroud)

我主要对这种行为的原因感兴趣.但是如果有办法确保一致的行为,那也很高兴知道!

python cpython python-3.x python-internals

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

如何使用__pycache__文件夹运行Python项目?

我想使用Python编译(.pyc__pycache__)运行一个Pythonic项目。为了在Python2中做到这一点,我没有任何问题。


这是Python2项目中的简化示例:


现在,我想在Python3项目中重试此行为。

这是一个简化的asyncio(在Python3中可用)项目:

python cpython compilation pyc python-3.x

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

为什么@property在字节码相同的情况下会使属性变慢

考虑下面这段代码:

import timeit
import dis

class Bob(object):
    __slots__ = "_a",

    def __init__(self):
        self._a = "a"

    @property
    def a_prop(self):
        return self._a

bob = Bob()

def return_attribute():
    return bob._a

def return_property():
    return bob.a_prop

print(dis.dis(return_attribute))
print(dis.dis(return_property))

print("attribute:")
print(timeit.timeit("return_attribute()",
                    setup="from __main__ import return_attribute", number=1000000))
print("@property:")
print(timeit.timeit("return_property()",
                    setup="from __main__ import return_property", number=1000000))

Run Code Online (Sandbox Code Playgroud)

很容易看到return_attributereturn_property导致相同的字节码:

 17           0 LOAD_GLOBAL              0 (bob)
              3 LOAD_ATTR                1 (_a)
              6 RETURN_VALUE        
None
 20           0 LOAD_GLOBAL              0 (bob)
              3 LOAD_ATTR                1 (a_prop)
              6 RETURN_VALUE        
None
Run Code Online (Sandbox Code Playgroud)

但是,时间有所不同:

 17           0 LOAD_GLOBAL …
Run Code Online (Sandbox Code Playgroud)

python performance cpython properties python-internals

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

python内存如何管理字符串对象?

for count in range(5):
    str1 = 'a' * count
    str2 = 'a' * count
    print(id(str1) == id(str2))

Output:
    True
    True
    False
    False
    False      
Run Code Online (Sandbox Code Playgroud)

为什么我们会虚假,因为

str1 = 'aaa'
str2 = 'aaa'
print(id(str1) == id(str2)) # True 
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这种python内存行为。

python cpython python-3.x

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