当尝试使用Python内置模块'timeit'时,如下所示:
timeit.Timer('print "hi"').timeit()
Run Code Online (Sandbox Code Playgroud)
它打印多行; 这是为什么?它不断印刷"喜":
hi
hi
hi
hi
...
Run Code Online (Sandbox Code Playgroud) Python:我想知道这个方法listdir在哪里,因为他不在模块os.py中.在这个模块中没有一个方法:
def listdir ()
Run Code Online (Sandbox Code Playgroud) 我们在Python中称之为"堆栈"是什么?它是CPython的C堆栈吗?我读到Python堆栈帧是在堆中分配的.但我认为堆栈的目标是...堆栈堆栈帧.那堆栈到底是做什么的?
当我尝试在Visual Studio python中运行我的代码时,为什么会收到错误消息" 我们没有找到任何解释器 "?
我看到一些我不理解的行为.我认为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的文档,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的集合与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编译(.pyc或__pycache__)运行一个Pythonic项目。为了在Python2中做到这一点,我没有任何问题。
这是Python2项目中的简化示例:
项目树:
test2
??? main.py
??? subfolder
??? __init__.py
??? sub.py
Run Code Online (Sandbox Code Playgroud)编译:
python -m compileall test2
Run Code Online (Sandbox Code Playgroud)编译后的项目树:
test2
??? main.py
??? main.pyc
??? subfolder
??? __init__.py
??? __init__.pyc
??? sub.py
??? sub.pyc
Run Code Online (Sandbox Code Playgroud)如您所见,几个.pyc手动生成。现在,我可以正常运行该项目main.pyc,该项目与sub.py:有关系:
python main.pyc
Run Code Online (Sandbox Code Playgroud)
出:
Hi
Bye
Run Code Online (Sandbox Code Playgroud)main.py内容:
from subfolder import sub
print('Bye')
Run Code Online (Sandbox Code Playgroud)sub.py内容:
print('Hi')
Run Code Online (Sandbox Code Playgroud)现在,我想在Python3项目中重试此行为。
这是一个简化的asyncio(在Python3中可用)项目:
项目树:
test3
??? main.py
??? subfolder
??? __init__.py
??? …Run Code Online (Sandbox Code Playgroud)考虑下面这段代码:
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_attribute并return_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) 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内存行为。
cpython ×10
python ×9
python-3.x ×4
compilation ×1
lambda ×1
listdir ×1
performance ×1
properties ×1
pyc ×1
python-2.7 ×1
timeit ×1