小编Abd*_*P M的帖子

How does the following expression work in python?

How does the following expression work in python?

>>> 1 ++++++++++++++++++++ 1
2
>>> 1 ++++++++++++++++++++-+ 1
0
Run Code Online (Sandbox Code Playgroud)

I thought this would raise SyntaxError but that was not the case.

python

16
推荐指数
1
解决办法
536
查看次数

如果元组在设计上是不可变的,为什么 cpython 将“PyTuple_SetItem”公开为 C-API?

中的元组在设计上是不可变的,因此如果我们尝试改变元组对象,会发出以下TypeError有意义的信息。

>>> a = (1, 2, 3)
>>> a[0] = 12
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果元组在设计上是不可变的,为什么cpython 公开PyTuple_SetItem为 C-API

从文档中它被描述为

int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)

o在 指向的元组的 pos 位置插入对对象的引用p0成功归来。如果 pos 越界,则返回-1并设置 IndexError 异常。

这句话不是和tuple[index] = valuepython层中的完全一样吗?如果目标是从项目集合创建一个元组,我们可以使用PyTuple_Pack.

附加说明:

经过大量的试验和错误后,ctypes.pythonapi我设法使用以下命令来改变元组对象PyTuple_SetItem

import ctypes

from …
Run Code Online (Sandbox Code Playgroud)

python ctypes tuples cpython python-3.x

12
推荐指数
1
解决办法
733
查看次数

使用整数和单词对字符串进行排序,而不改变其位置

说我有一个字符串a.

a = "12 I have car 8 200 a"
Run Code Online (Sandbox Code Playgroud)

我需要以输出应该这样的方式对这个字符串进行排序

8 a car have 12 200 I
Run Code Online (Sandbox Code Playgroud)

即,对字符串进行排序,使所有单词按字母顺序排列,所有整数按数字顺序排列.此外,如果字符串中的第n个元素是整数,则它必须保持整数,如果是单词则必须保留为单词.

这是我试过的.

a = "12 I have car 8 200 a"


def is_digit(element_):
    """
    Function to check the item is a number. We can make using of default isdigit function
    but it will not work with negative numbers.
    :param element_:
    :return: is_digit_
    """
    try:
        int(element_)
        is_digit_ = True
    except ValueError:
        is_digit_ = False

    return is_digit_



space_separated = a.split()

integers = [int(i) for …
Run Code Online (Sandbox Code Playgroud)

python sorting performance iterator python-2.7

8
推荐指数
1
解决办法
732
查看次数

“show_caches”和“adaptive”参数在“dis.dis”函数中起什么作用

Python3.11向该dis.dis函数引入了两个新参数,show_cachesadaptive

>>> 导入磁盘
>>>
>>> 帮助(dis.dis)
模块 dis 中函数 dis 的帮助:

dis(x=无、*、文件=无、深度=无、show_caches=False、自适应=False )
    反汇编类、方法、函数和其他编译对象。

    不带任何参数,反汇编最后一个回溯。

    编译对象目前包括生成器对象、异步生成器
    对象和协程对象,它们都存储它们的代码对象
    在一个特殊的属性中。

这个参数在 python 3.11 中意味着什么?我确实通过将其设置为来检查结果,True但结果与将其设置为相同False

>>> dis.dis("a = 1", show_caches=True, adaptive=True)
  0           0 RESUME                   0

  1           2 LOAD_CONST               0 (1)
              4 STORE_NAME               0 (a)
              6 LOAD_CONST               1 (None)
              8 RETURN_VALUE
>>>
>>>
>>> dis.dis("a = 1")
  0           0 RESUME                   0

  1           2 LOAD_CONST               0 (1)
              4 STORE_NAME               0 (a)
              6 …
Run Code Online (Sandbox Code Playgroud)

python python-3.11

8
推荐指数
1
解决办法
219
查看次数

python语法中的“~”是什么意思

我正在经历python 语法规范并找到以下语句

\n
\nfor_stmt:\n | \'for\' star_targets \'in\' ~ star_expressions \':\' [TYPE_COMMENT] 块 [else_block]\n
\n

~这个语法规则是什么意思?语法中使用的其他符号(如&, !, |)已记录但尚未记录~

\n
\n

EBNF该符号是和的混合PEG。特别是,&后面跟有符号、标记或括号组表示正向先行(即需要匹配但不消耗),而!表示负向先行(即不需要匹配)。我们\n使用|分隔符来表示 PEG\xe2\x80\x99s \xe2\x80\x9cordered choice\xe2\x80\x9d (写为/传统 PEG 语法编写)

\n
\n

python parsing cpython ebnf peg

7
推荐指数
1
解决办法
319
查看次数

带有自定义类实例的 operator.index

我下面有一个简单的类,

class MyClass(int):
    def __index__(self):
        return 1
Run Code Online (Sandbox Code Playgroud)

根据operator.index文档,

operator.index(a)

返回一个转换为整数的值。相当于a.__index__()

但是当我使用operator.indexMyClass实例,我得到了100,而不是1(我越来越1如果我用a.__index__())。这是为什么?。

>>> a = MyClass(100)
>>>
>>> import operator
>>> print(operator.index(a))
100
>>> print(a.__index__())
1
Run Code Online (Sandbox Code Playgroud)

python python-3.x

6
推荐指数
2
解决办法
252
查看次数

为什么这个特定代码在 Python 3.11 中运行得更快?

我在一个名为 的 Python 文件中有以下代码benchmark.py

source = """
for i in range(1000):
    a = len(str(i)) 
"""

import timeit

print(timeit.timeit(stmt=source, number=100000))
Run Code Online (Sandbox Code Playgroud)

当我尝试运行多个 python 版本时,我发现性能存在巨大差异。

C:\Users\Username\Desktop>py -3.10 benchmark.py
16.79652149998583

C:\Users\Username\Desktop>py -3.11 benchmark.py
10.92280820000451
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这段代码在 python 3.11 中运行得比以前的 Python 版本更快。我尝试反汇编字节码以了解此行为的原因,但我只能看到操作码名称的差异(CALL_FUNCTION被替换为PRECALLCALL操作码)。

我很不确定这是否是性能变化的原因。所以我正在寻找一个参考 cpython 源代码来证明合理的答案。

python 3.11字节码

  0           0 RESUME                   0

  2           2 PUSH_NULL
              4 LOAD_NAME                0 (range)
              6 LOAD_CONST               0 (1000)
              8 PRECALL                  1
             12 CALL                     1
             22 GET_ITER
        >>   24 FOR_ITER                22 …
Run Code Online (Sandbox Code Playgroud)

python performance cpython python-3.x python-3.11

6
推荐指数
1
解决办法
1096
查看次数

python 匹配字符串的大小写部分

我想知道是否可以在 Python 中使用匹配大小写来在字符串中进行匹配 - 即字符串是否包含匹配大小写。例子:

mystring = "xmas holidays"
match mystring:
      case "holidays":
           return true
      case "workday":
           return false
Run Code Online (Sandbox Code Playgroud)

我可以理解为什么它不会,因为这可能会同时匹配多个案例,但我想知道这是否可能。

python match python-3.10

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

如何从PyListObject中"pop"元素?

让我说我有一个PyListObject,我想附加一个PyObject然后我可以使用PyList_Append记录在其中的API List Objects C-API.但是对于我的用例,我想要pop一个元素PyListObject(即my_list.pop()在python层中).

但是List Objects C-API文档没有提到有关pop操作的任何内容.

那么有关于PyListPopAPI函数的文档吗?

python cpython list python-c-api python-3.x

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

查找C中实现的方法的源代码?

请注意,我这个问题仅供参考

我知道标题听起来像是查找内置Python函数的源代码的副本.但让我解释一下.

比方说,我想找到类most_common方法的源代码collections.Counter.由于Counter该类是在python中实现的,我可以使用该inspect模块获取它的源代码.

>>> import inspect
>>> import collections
>>> print(inspect.getsource(collections.Counter.most_common))
Run Code Online (Sandbox Code Playgroud)

这将打印

    def most_common(self, n=None):
        '''List the n most common elements and their counts from the most
        common to the least.  If n is None, then list all element counts.

        >>> Counter('abcdeabcdabcaba').most_common(3)
        [('a', 5), ('b', 4), ('c', 3)]

        '''
        # Emulate Bag.sortedByCount from Smalltalk
        if n is None:
            return sorted(self.items(), key=_itemgetter(1), reverse=True)
        return _heapq.nlargest(n, self.items(), key=_itemgetter(1))
Run Code Online (Sandbox Code Playgroud)

因此,如果在C中实现的方法或类 …

cpython python-3.x python-internals

2
推荐指数
1
解决办法
234
查看次数

为什么字符串乘法的字节码不同?

我正在摆弄字符串并遇到以下行为:

>>> import dis
>>> dis.dis('"abcdefgh" * 513')
  1           0 LOAD_CONST               0 ('abcdefgh')
              2 LOAD_CONST               1 (513)
              4 BINARY_MULTIPLY
              6 RETURN_VALUE
>>> dis.dis('"abcdefgh" * 512')
  1           0 LOAD_CONST               0 ('abcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefghabcdefgh')
              2 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,当我乘以 时"abcdefgh"512python 在编译阶段预先计算完整的字符串,但是当我将数字更改为513它时,它不再这样做,而是生成两个LOAD_CONSTBINARY_MULTIPLY操作码(换句话说,python 不再预先计算编译阶段的结果)。有人可以解释这种行为的原因吗?

注意:我知道从代码的角度来看它工作得很好,但我很想知道这种行为的原因。

python cpython compiler-optimization python-3.x python-internals

2
推荐指数
1
解决办法
141
查看次数

如果“start”参数是自定义类的实例,为什么 sum 函数会变慢?

我在玩弄sum函数并观察到以下行为。

情况1:

source = """
class A:
    def __init__(self, a):
        self.a = a
    
    def __add__(self, other):
        return self.a + other;

sum([*range(10000)], start=A(10))
"""

import timeit
print(timeit.timeit(stmt=source))
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我使用自定义类的实例作为函数start的参数sum。在我的系统中,对上面的代码进行基准测试大约需要几192.60747704200003秒钟的时间。

案例2:

source = """
class A:
    def __init__(self, a):
        self.a = a
    
    def __add__(self, other):
        return self.a + other;

sum([*range(10000)], start=10).  <- Here
"""

import timeit
print(timeit.timeit(stmt=source))
Run Code Online (Sandbox Code Playgroud)

但如果我删除自定义类实例并int直接使用对象,则只需要111.48285191600007几秒钟。我很想知道这种速度差异的原因是什么?

我的系统信息:

>>> import platform
>>> platform.platform()
'macOS-12.5-arm64-arm-64bit'
>>> import sys
>>> sys.version
'3.11.0 …
Run Code Online (Sandbox Code Playgroud)

python optimization cpython python-3.x python-3.11

2
推荐指数
1
解决办法
199
查看次数