标签: cpython

布尔标识== 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万
查看次数

为什么列表推导式在内部创建一个函数?

中列表理解的反汇编:

Python 3.10.12 (main, Jun 11 2023, 05:26:28) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> 
>>> dis.dis("[True for _ in ()]")
  1           0 LOAD_CONST               0 (<code object <listcomp> at 0x7fea68e0dc60, file "<dis>", line 1>)
              2 LOAD_CONST               1 ('<listcomp>')
              4 MAKE_FUNCTION            0
              6 LOAD_CONST               2 (())
              8 GET_ITER
             10 CALL_FUNCTION            1
             12 RETURN_VALUE

Disassembly of <code object <listcomp> at 0x7fea68e0dc60, file "<dis>", line 1>:
  1           0 BUILD_LIST               0
              2 LOAD_FAST …
Run Code Online (Sandbox Code Playgroud)

python cpython list-comprehension python-internals dis

47
推荐指数
1
解决办法
3256
查看次数

什么是python-dev包用于

我最近安装了lxml.

在此之前,我必须为此安装所有依赖项.所以我尝试安装liblxml2-dev,liblxslt1-devpython-dev (谷歌搜索了所需的包lxml)

但即使在那之后,我也无法lxml使用该命令 进行安装pip install lxml.

但是因为我使用的是Python 3.4.0,我认为可能存在不同的版本python-dev(思想是由于面临一些类似的版本冲突问题).所以我试着安装python3-dev.

然后我尝试lxml使用前面说过的相同命令进行安装,并且工作正常!

因为我是新手.所以,我的google搜索那些句子,我能看得懂的意义lxmlxslt.我找到了一个链接,python-dev但我还不确定它到底在做什么.

谁能帮忙:)

python cpython

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

我怎么知道我正在使用哪个python实现?

Python有几个不同的实现:CPython,Jython,PyPy等.我想以编程方式确定运行我的代码的实现.我怎样才能做到这一点?

具体来说,写一个get_implementation_name()为我调用的函数:

impl_name = get_implementation_name()
if impl_name == "CPython":
  print "I can abuse CPython implementation details. (I'm a bad, bad man.)"
elif impl_name == "PyPy":
  print "Can't count on reference-counting garbage collection here..."
else:
  print "I better be careful..."
Run Code Online (Sandbox Code Playgroud)

python cpython

43
推荐指数
2
解决办法
8568
查看次数

为什么-1和-2都在CPython中哈希到-2?

可能重复:
何时计算python对象的哈希值,为什么-1的哈希值不同?

如果Python,为什么-1-2两者都哈希到相同的数字?

既然他们这样做,Python如何区分这两个数字?

>>> -1 is -2
False
>>> hash(-1) is hash(-2)
True
>>> hash(-1)
-2
>>> hash(-2)
-2
Run Code Online (Sandbox Code Playgroud)

python hash cpython

36
推荐指数
1
解决办法
2001
查看次数

为什么Python 3比Python 2慢得多?

我一直试图理解为什么Python 3在某些情况下与Python 2相比实际上需要花费很多时间,下面是我从python 3.4到python 2.7验证的少数情况.

注意:我已经解决了一些问题,比如为什么Python3中没有xrange函数?在python3比python2慢得多环路比同一代码在Python3慢Python2,但我觉得我没有得到这背后问题的实际原因.

我已经尝试过这段代码来展示它是如何产生差异的:

MAX_NUM = 3*10**7

# This is to make compatible with py3.4.
try:
    xrange
except:
    xrange = range


def foo():
    i = MAX_NUM
    while i> 0:
        i -= 1

def foo_for():
    for i in xrange(MAX_NUM):
        pass
Run Code Online (Sandbox Code Playgroud)

当我尝试用py3.4和py2.7运行这个程序时,我得到了以下结果.

注意:这些统计数据来自64 bit具有2.6Ghz处理器的计算机,并使用time.time()单循环计算时间.

Output : Python 3.4
-----------------
2.6392083168029785
0.9724123477935791

Output: Python 2.7
------------------
1.5131521225
0.475143909454
Run Code Online (Sandbox Code Playgroud)

我真的不认为出现了适用于变更whilexrange从2.7到3.4,我知道range已经开始作为对xrange在py3.4但文件说,

range() …

python performance cpython python-2.7 python-3.x

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

为什么 a=[0] 的 list(x for x in a) 比 a=[] 快?

list(x for x in a)用三个不同的 CPython 版本进行了测试。Ona = [0]比 on 快得多a = []

 3.9.0 64-bit       3.9.0 32-bit       3.7.8 64-bit
a = []  a = [0]    a = []  a = [0]    a = []  a = [0]

465 ns  412 ns     543 ns  515 ns     513 ns  457 ns   
450 ns  406 ns     544 ns  515 ns     506 ns  491 ns   
456 ns  408 ns     551 ns  513 ns     515 ns  487 ns   
455 …
Run Code Online (Sandbox Code Playgroud)

python performance cpython python-internals

36
推荐指数
1
解决办法
822
查看次数

为什么python中的字符串比较如此之快?

当我解决以下示例算法问题时,我很好奇理解字符串比较在python中如何工作的内部:

给定两个字符串,返回最长公共前缀的长度

解决方案1:charByChar

我的直觉告诉我,最佳解决方案是在两个单词的开头用一个光标开始并向前迭代,直到前缀不再匹配.就像是

def charByChar(smaller, bigger):
  assert len(smaller) <= len(bigger)
  for p in range(len(smaller)):
    if smaller[p] != bigger[p]:
      return p
  return len(smaller)
Run Code Online (Sandbox Code Playgroud)

为了简化代码,该函数假定第一个字符串的长度smaller始终小于或等于第二个字符串的长度bigger.

解决方案2:binarySearch

另一种方法是将两个字符串平分以创建两个前缀子字符串.如果前缀相等,我们知道公共前缀点至少与中点一样长.否则,公共前缀点至少不大于中点.然后我们可以递归以找到前缀长度.

阿卡二进制搜索.

def binarySearch(smaller, bigger):
  assert len(smaller) <= len(bigger)
  lo = 0
  hi = len(smaller)

  # binary search for prefix
  while lo < hi:
    # +1 for even lengths
    mid = ((hi - lo + 1) // 2) + lo

    if smaller[:mid] == bigger[:mid]:
      # prefixes equal
      lo = mid
    else: …
Run Code Online (Sandbox Code Playgroud)

python x86 interpreter cpython strncmp

34
推荐指数
1
解决办法
1639
查看次数

Python的垃圾收集器如何检测循环引用?

我试图了解Python的垃圾收集器如何检测循环引用.当我查看文档时,我看到的只是一个声明,即检测到循环引用,除非涉及的对象有__del__方法.

如果发生这种情况,我的理解(可能是错误的)是gc模块通过(我假设)遍历所有分配的内存并释放任何无法访问的块来充当故障保护.

在使用gc模块之前,Python如何检测和释放循环内存引用?

python garbage-collection cpython

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

Python或IronPython

IronPython如何从python.org堆叠到Python的默认Windows实现?如果我正在学习Python,我是否会使用IronPython学习一种微妙的不同语言,以及我将不使用哪些库?

或者,IronPython的任何专业人士(不包括.NET IL编译类)是否会使其更具吸引力?

python ironpython cpython

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