相关疑难解决方法(0)

为什么比较匹配的字符串比比较不匹配的字符串更快?

这里有两个测量值:

timeit.timeit('"toto"=="1234"', number=100000000)
1.8320042459999968
timeit.timeit('"toto"=="toto"', number=100000000)
1.4517491540000265
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,比较两个匹配的字符串比比较两个大小相同但不匹配的字符串要快。这是相当令人不安的:在字符串比较期间,我相信 Python 正在逐个字符地测试字符串,因此"toto"=="toto"测试时间应该比"toto"=="1234"它需要针对一个不匹配比较进行四次测试的时间更长。也许比较是基于哈希的,但在这种情况下,两次比较的时间应该相同。

为什么?

python comparison performance

77
推荐指数
2
解决办法
8022
查看次数

为什么startwith比切片慢

为什么执行startwith比切片慢?

In [1]: x = 'foobar'

In [2]: y = 'foo'

In [3]: %timeit x.startswith(y)
1000000 loops, best of 3: 321 ns per loop

In [4]: %timeit x[:3] == y
10000000 loops, best of 3: 164 ns per loop
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,即使包括计算长度,切片仍然显得更快:

In [5]: %timeit x[:len(y)] == y
1000000 loops, best of 3: 251 ns per loop
Run Code Online (Sandbox Code Playgroud)

注意:此行为的第一部分在Python for Data Analysis(第3章)中有说明,但没有提供解释.

.

如果有用:这是C代码startswith ; 这是输出dis.dis:

In [6]: import dis

In [7]: dis_it = lambda …
Run Code Online (Sandbox Code Playgroud)

python startswith

47
推荐指数
4
解决办法
5407
查看次数

Python编译/解释过程

我试图更清楚地理解python编译器/解释器进程.不幸的是,我没有参加口译课,也没有读过很多关于它们的内容.

基本上,我现在理解的是.py文件中的Python代码首先编译成python字节码(我假设偶尔会看到.pyc文件?).接下来,字节码被编译成机器代码,这是处理器实际理解的语言.差不多,我已经读过这个帖子为什么python在解释前将源代码编译成字节码?

有人能给我一个很好的解释整个过程,记住我对编译器/解释器的了解几乎不存在吗?或者,如果这不可能,也许给我一些资源,快速概述编译器/解释器?

谢谢

python compiler-construction interpreter

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

如何读取python字节码?

我在理解Python的字节码及其dis模块时遇到了很多困难.

import dis
def func():
   x = 1
dis.dis(func)
Run Code Online (Sandbox Code Playgroud)

在解释器中输入上面的代码会产生以下输出:

    0 LOAD_CONST                  1(1)
    3 STORE_FAST                  0(x)
    6 LOAD_CONST                  0(NONE)
    9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

例如:

是什么意思LOAD_CONST,STORE_FAST和喜欢的数字0,3,69

我将非常感谢您可以找到此信息的特定资源.

python bytecode python-2.7

17
推荐指数
1
解决办法
7583
查看次数

初始化空Python数据结构

在可用于创建空Python列表/词典的两种语法形式之间是否存在任何明显的差异,即

l = list()
l = []
Run Code Online (Sandbox Code Playgroud)

和:

d = dict()
d = {}
Run Code Online (Sandbox Code Playgroud)

我想知道使用一个是否优于另一个.

python dictionary list

12
推荐指数
2
解决办法
2457
查看次数

何时检查是否存在非局部变量?

我正在学习Python,现在我正在讨论范围和非本地语句.在某些时候,我以为我想到了这一切,但随后非本地人来了,打破了一切.

示例1:

print( "let's begin" )
def a():
    def b():
        nonlocal x
        x = 20
    b()

a()
Run Code Online (Sandbox Code Playgroud)

自然运行失败.
更有趣的是,print()不会被执行.为什么?.

我的理解是封闭def a()在执行之前print()不会执行,嵌套def b()只在a()被调用时执行.我很迷惑...

好的,让我们尝试第2个例子:

print( "let's begin" )
def a():
    if False: x = 10
    def b():
        nonlocal x
        x = 20
    b()

a()
Run Code Online (Sandbox Code Playgroud)

Aaand ......它运行良好.Whaaat?这是怎么解决的?x = 10在函数a中永远不会执行!

我的理解是在运行时评估和执行非本地语句,搜索封闭函数的调用上下文并将本地名称绑定x到某个特定的"外部" x.如果x外部函数中没有- 引发异常.再次,在运行时.

但现在看来这是在语法分析时完成的,非常愚蠢的检查"看看外部函数x = blah,如果有这样的东西 - 我们很好",即使x = blah从未执行过...... …

python scope python-3.x

10
推荐指数
1
解决办法
472
查看次数

如何使用`dis.dis`来分析性能?

我正在尝试使用python的dis库来试验和理解性能.以下是我尝试过的实验,结果如下.

import dis

def myfunc1(dictionary):
    t = tuple(dictionary.items())
    return t

def myfunc2(dictionary, func=tuple):
    t = func(dictionary.items())
    return t
Run Code Online (Sandbox Code Playgroud)

>>> dis.dis(myfunc1)

  4           0 LOAD_GLOBAL              0 (tuple)
              3 LOAD_FAST                0 (dictionary)
              6 LOAD_ATTR                1 (items)
              9 CALL_FUNCTION            0
             12 CALL_FUNCTION            1
             15 STORE_FAST               1 (t)

  5          18 LOAD_FAST                1 (t)
             21 RETURN_VALUE 
Run Code Online (Sandbox Code Playgroud)

>>> dis.dis(myfunc2)

  4           0 LOAD_FAST                1 (func)
              3 LOAD_FAST                0 (dictionary)
              6 LOAD_ATTR                0 (items)
              9 CALL_FUNCTION            0
             12 CALL_FUNCTION            1
             15 STORE_FAST               2 (t)

  5          18 LOAD_FAST …
Run Code Online (Sandbox Code Playgroud)

python performance python-2.7

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

以下两个陈述有什么区别?

x = func(*(xa,) + args)
y = func(*((xc,) + args)) 
Run Code Online (Sandbox Code Playgroud)

其中args是一个数组,函数定义是:

def func(lamb, data):
    # statements
Run Code Online (Sandbox Code Playgroud)

我了解到了*args,但我找不到这些线之间的确切差异.

python

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

运行时间:打印计数是一步吗?

假设我有一个函数,我想分析确切步数的运行时间:

def function(L):
    print ("Hello")
    i = 0                 # 1 step
    while i < len(L):     # 3 steps
        print (L[i] + 1)
        i += 2            # 2 steps
    print ("Goodbye")
Run Code Online (Sandbox Code Playgroud)

我想知道印刷语句是否算作一个步骤?

python performance

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

当函数ONLY有1个if语句时,函数是否需要else/elif?

这两个函数在调用时似乎返回相同的值.但是,我想知道在某些情况下2号是否会引发错误?这样做是不好的做法吗?

1号:

def not_sum_to_ten(num1, num2):
  if num1 + num2 != 10:
    return True
  else:
    return False
Run Code Online (Sandbox Code Playgroud)

2号:

def not_sum_to_ten(num1, num2):
  if num1 + num2 != 10:
    return True
  return False
Run Code Online (Sandbox Code Playgroud)

感谢您分享您的知识!

python

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