标签: cpython

IronPython与Python .NET

我想从Python代码访问一些用C#编写的.NET程序集.

一点研究表明我有两个选择:

两种解决方案之间的权衡取舍是什么?

.net python ironpython cpython python.net

80
推荐指数
6
解决办法
6万
查看次数

list()比列表理解使用更多的内存

所以我正在玩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()它会占用更多内存. …

python cpython list-comprehension list python-internals

78
推荐指数
2
解决办法
3295
查看次数

为什么代码使用中间变量比没有代码更快?

我遇到了这种奇怪的行为并且无法解释它.这些是基准:

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%)

python cpython python-3.x python-internals

76
推荐指数
2
解决办法
5388
查看次数

Python 3中不同的对象大小True和False

__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

python cpython python-2.7 python-3.x python-internals

67
推荐指数
4
解决办法
2884
查看次数

为什么更简单的循环速度更慢?

调用 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 performance cpython python-internals python-3.11

62
推荐指数
1
解决办法
9685
查看次数

OrderedDict理解

我可以在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

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

为什么对于 bytearray 来说 b.pop(0) 比 del b[0] 慢 200 多倍?

让他们竞争 3 次(每次 100 万次弹出/删除):

\n
from 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)\n
Run Code Online (Sandbox Code Playgroud)\n

时间比例(在线尝试!):

\n
274.6037053753368\n219.38099365582403\n252.08691226683823\n
Run Code Online (Sandbox Code Playgroud)\n

为什么pop做同样的事情要慢得多?

\n

python arrays performance cpython python-internals

57
推荐指数
2
解决办法
6156
查看次数

为什么字符串的开头慢于?

令人惊讶的是,我发现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 cpython startswith python-2.7 python-internals

55
推荐指数
1
解决办法
3336
查看次数

为什么大小为2⁶³36字节,但2⁶³-1只有24字节?

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)

题:

内存存储在这些场景中如何工作? …

python cpython python-2.7 python-internals

51
推荐指数
2
解决办法
5309
查看次数

布尔标识== True vs为True

使用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 == Trueif foo is True通常应用于确定是否foo具有真实值. …

python pypy boolean jython cpython

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