我想从Python代码访问一些用C#编写的.NET程序集.
一点研究表明我有两个选择:
两种解决方案之间的权衡取舍是什么?
所以我正在玩list对象,并发现一些奇怪的事情,如果list创建list()它使用更多的内存,而不是列表理解?我正在使用Python 3.5.2
In [1]: import sys
In [2]: a = list(range(100))
In [3]: sys.getsizeof(a)
Out[3]: 1008
In [4]: b = [i for i in range(100)]
In [5]: sys.getsizeof(b)
Out[5]: 912
In [6]: type(a) == type(b)
Out[6]: True
In [7]: a == b
Out[7]: True
In [8]: sys.getsizeof(list(b))
Out[8]: 1008
Run Code Online (Sandbox Code Playgroud)
来自文档:
列表可以通过以下几种方式构建:
- 使用一对方括号表示空列表:
[]- 使用方括号,用逗号分隔项目:
[a],[a, b, c]- 使用列表理解:
[x for x in iterable]- 使用类型构造函数:
list()或list(iterable)
但似乎使用list()它会占用更多内存. …
我遇到了这种奇怪的行为并且无法解释它.这些是基准:
py -3 -m timeit "tuple(range(2000)) == tuple(range(2000))"
10000 loops, best of 3: 97.7 usec per loop
py -3 -m timeit "a = tuple(range(2000)); b = tuple(range(2000)); a==b"
10000 loops, best of 3: 70.7 usec per loop
Run Code Online (Sandbox Code Playgroud)
为什么与变量赋值的比较比使用临时变量的单个衬里快27%以上?
通过Python文档,在timeit期间禁用垃圾收集,因此它不可能.这是某种优化吗?
结果也可以在Python 2.x中重现,但程度较小.
运行Windows 7,CPython 3.5.1,Intel i7 3.40 GHz,64位操作系统和Python.看起来像我尝试在Intel i7 3.60 GHz上使用Python 3.5.0运行的另一台机器不能重现结果.
使用与timeit.timeit()@ 10000循环相同的Python进程运行分别产生0.703和0.804.仍显示尽管程度较轻.(〜12.5%)
__sizeof__在不同的Python对象上尝试使用魔术方法(特别是)我偶然发现了以下行为:
Python 2.7
>>> False.__sizeof__()
24
>>> True.__sizeof__()
24
Run Code Online (Sandbox Code Playgroud)
Python 3.x
>>> False.__sizeof__()
24
>>> True.__sizeof__()
28
Run Code Online (Sandbox Code Playgroud)
Python 3中改变了什么使得大小True超过了False?
调用 with n = 10**8,对我来说,简单循环始终比复杂循环慢得多,我不明白为什么:
def simple(n):
while n:
n -= 1
def complex(n):
while True:
if not n:
break
n -= 1
Run Code Online (Sandbox Code Playgroud)
有时以秒为单位:
def simple(n):
while n:
n -= 1
def complex(n):
while True:
if not n:
break
n -= 1
Run Code Online (Sandbox Code Playgroud)
这是字节码的循环部分,如下所示dis.dis(simple):
6 >> 6 LOAD_FAST 0 (n)
8 LOAD_CONST 1 (1)
10 BINARY_OP 23 (-=)
14 STORE_FAST 0 (n)
5 16 LOAD_FAST 0 (n)
18 POP_JUMP_BACKWARD_IF_TRUE 7 (to 6)
Run Code Online (Sandbox Code Playgroud)
对于complex:
10 >> 4 …Run Code Online (Sandbox Code Playgroud) 我可以在python中为其他dicts的dict comprehension扩展语法,比如collections模块中的OrderedDict 或继承自我自己的类型dict吗?
重新绑定dict名称显然不起作用,{key: value}理解语法仍然为您提供了一个简单的旧词典,用于理解和文字.
>>> from collections import OrderedDict
>>> olddict, dict = dict, OrderedDict
>>> {i: i*i for i in range(3)}.__class__
<type 'dict'>
Run Code Online (Sandbox Code Playgroud)
那么,如果可能的话我该怎么做呢?如果它只适用于CPython,那就没关系.对于语法,我想我会尝试使用O{k: v}像我们一样的前缀r'various' u'string' b'objects'.
注意: 当然我们可以使用生成器表达式,但我更感兴趣的是看到语法方面的hathon是多么糟糕.
python dictionary cpython ordereddictionary dictionary-comprehension
让他们竞争 3 次(每次 100 万次弹出/删除):
\nfrom timeit import timeit\n\nfor _ in range(3):\n t1 = timeit(\'b.pop(0)\', \'b = bytearray(1000000)\')\n t2 = timeit(\'del b[0]\', \'b = bytearray(1000000)\')\n print(t1 / t2)\nRun Code Online (Sandbox Code Playgroud)\n时间比例(在线尝试!):
\n274.6037053753368\n219.38099365582403\n252.08691226683823\nRun Code Online (Sandbox Code Playgroud)\n为什么pop做同样的事情要慢得多?
令人惊讶的是,我发现startswith速度比in:
In [10]: s="ABCD"*10
In [11]: %timeit s.startswith("XYZ")
1000000 loops, best of 3: 307 ns per loop
In [12]: %timeit "XYZ" in s
10000000 loops, best of 3: 81.7 ns per loop
Run Code Online (Sandbox Code Playgroud)
众所周知,in操作需要搜索整个字符串,startswith只需要检查前几个字符,所以startswith应该更有效率.
什么时候s足够大,startswith速度更快:
In [13]: s="ABCD"*200
In [14]: %timeit s.startswith("XYZ")
1000000 loops, best of 3: 306 ns per loop
In [15]: %timeit "XYZ" in s
1000000 loops, best of 3: 666 ns per loop
Run Code Online (Sandbox Code Playgroud)
所以看起来调用 …
Python中的所有东西都是一个对象.因此Python中int的大小将比平常大.
>>> sys.getsizeof(int())
24
Run Code Online (Sandbox Code Playgroud)
好的,但为什么还需要12个字节才能进行2?³比较2?³ - 1,而不仅仅是一个?
>>> sys.getsizeof(2**63)
36
>>> sys.getsizeof(2**62)
24
Run Code Online (Sandbox Code Playgroud)
我得到的2?³是一个long和2?³-1一个int,但为什么12个字节的区别?
不再直观,我尝试了一些其他的东西:
>>> a = 2**63
>>> a -= 2**62
>>> sys.getsizeof(a)
36
Run Code Online (Sandbox Code Playgroud)
a即使它现在可以在int中,仍然存储为long.所以这并不奇怪.但:
>>> a -= (2**63 - 1)
>>> a = 2**63
>>> a -= (2**63 - 1)
>>> a
1L
>>> sys.getsizeof(a)
28
Run Code Online (Sandbox Code Playgroud)
一个新的尺寸.
>>> a = 2**63
>>> a -= 2**63
>>> a
0L
>>> sys.getsizeof(a)
24
Run Code Online (Sandbox Code Playgroud)
回到24个字节,但仍然很长.
我得到的最后一件事:
>>> sys.getsizeof(long())
24
Run Code Online (Sandbox Code Playgroud)
题:
内存存储在这些场景中如何工作? …
使用if foo is None而不是if foo == None测试值是否具体是标准惯例None.
如果你想确定一个值是否正确True(不仅仅是一个真实的值),是否有任何理由使用if foo == True而不是if foo is True?这在CPython(2.x和3.x),Jython,PyPy等实现之间是否有所不同?
示例:say True用作要与值'bar'或任何其他类似真值的值区分开的单例值:
if foo is True: # vs foo == True
...
elif foo == 'bar':
...
Run Code Online (Sandbox Code Playgroud)
是否存在使用if foo is True会产生不同结果的情况if foo == True?
注意:我知道Python布尔值 - 如果x:,则vs x == True,vs如果x为True.但是,它仅解决是否if foo,if foo == True或if foo is True通常应用于确定是否foo具有真实值. …
cpython ×10
python ×10
python-2.7 ×3
performance ×2
python-3.x ×2
.net ×1
arrays ×1
boolean ×1
dictionary ×1
ironpython ×1
jython ×1
list ×1
pypy ×1
python-3.11 ×1
python.net ×1
startswith ×1