标签: python-performance

调用time.sleep或subprocess.Popen后,为什么Python操作会慢30倍?

考虑以下循环:

for i in range(20):
    if i == 10:
        subprocess.Popen(["echo"]) # command 1
    t_start = time.time()
    1+1 # command 2
    t_stop = time.time()
    print(t_stop - t_start)
Run Code Online (Sandbox Code Playgroud)

当"命令1"在其之前运行时,"命令2"命令系统地运行更长时间.下图显示了1+1作为循环索引函数的执行时间i,平均超过100次运行.

执行1+1时比之前慢30倍subprocess.Popen.

作为循环索引的函数的<code>subprocess.Popen()</code>受到影响,但事实并非如此.以下循环显示<strong>当前循环迭代中的所有命令都受到影响</strong>.但随后的循环迭代似乎基本上没问题.</p>

<pre><code>var = 0
for i in range(20):
    if i == 10:
      # command 1
      subprocess.Popen(['echo'])
    # command 2a
    t_start = time.time()
    1 + 1
    t_stop = time.time()
    print(t_stop - t_start)
    # command 2b
    t_start = time.time()
    print(1)
    t_stop = time.time() …</code></pre><a target=Run Code Online (Sandbox Code Playgroud)

python performance subprocess python-performance

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

通过普通类、数据类和命名元组创建对象的有趣性能

我正在浏览数据类并命名元组。我发现这种行为在使用 python 的不同特性创建对象时具有不同的性能。

数据类

In [1]: from dataclasses import dataclass
   ...:
   ...: @dataclass
   ...: class Position:
   ...:     lon: float = 0.0
   ...:     lat: float = 0.0
   ...:

In [2]: %timeit for _ in range(1000): Position(12.5, 345)
326 µs ± 34.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
Run Code Online (Sandbox Code Playgroud)

普通班:

In [1]: class Position:
   ...:
   ...:     def __init__(self, lon=0.0, lat=0.0):
   ...:         self.lon = lon
   ...:         self.lat = lat
   ...:

In [2]: %timeit for _ in range(1000): …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-internals python-performance python-dataclasses

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

为什么这种测试回文的方法要慢得多?

我有两种不同的回文测试方法.一个是以下内容:

def palindrome(text):
    return text == text[::-1]
Run Code Online (Sandbox Code Playgroud)

当然很简单,但我想象它会很慢,因为它(当然)必须text[::-1]在反转之后存储某个地方的值,然后检查两者中的每个字符.所以,我尝试了另一种方法:

def palindrome_2(text):
    left = 0
    right = len(text) - 1
    while left < right:
        if text[left] != text[right]:
            return False
        right -= 1
        left += 1
    return True
Run Code Online (Sandbox Code Playgroud)

它从起点和终点开始,然后进入中心.据我所知,这应该更快,因为它只会检查[0, n // 2),反之亦然.但是,当我使用timeit来测试这些时,第一个是0.32第二个,第二个是1.34.为什么?

python native-code python-performance

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