小编sup*_*ain的帖子

timeit 和它的 default_timer 完全不同意

我对这两个函数进行了基准测试(它们将成对解压缩回源列表,来自这里):

n = 10**7
a = list(range(n))
b = list(range(n))
pairs = list(zip(a, b))

def f1(a, b, pairs):
    a[:], b[:] = zip(*pairs)

def f2(a, b, pairs):
    for i, (a[i], b[i]) in enumerate(pairs):
        pass
Run Code Online (Sandbox Code Playgroud)

结果timeit.timeit(五轮,数字为秒):

f1 1.06   f2 1.57   
f1 0.96   f2 1.69   
f1 1.00   f2 1.85   
f1 1.11   f2 1.64   
f1 0.95   f2 1.63   
Run Code Online (Sandbox Code Playgroud)

显然f1比 快很多f2,对吧?

但后来我也测量了timeit.default_timer并得到了完全不同的图片:

f1 7.28   f2 1.92   
f1 5.34   f2 1.66   
f1 6.46   f2 1.70   
f1 …
Run Code Online (Sandbox Code Playgroud)

python performance

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

近排序数组的插入排序最坏时间复杂度?

我有一个 n 元素数组。除了4?n它们之外的所有元素都被排序。我们不知道这些错位元素的位置。对此列表进行排序的最有效方法是什么?

有没有 O(n) 的方法来做到这一点?

更新 1:

的时间复杂度?对于几乎排序的数据,插入排序是 O(n)(在最坏的情况下是真的吗?)?

python arrays sorting algorithm data-structures

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

使用由两个列表排序产生的排序对第三个列表进行排序?

假设我有三个列表:

X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]
Z = [ 5,   2,   3,    1,   4,   9,   6,   0,   7]
Run Code Online (Sandbox Code Playgroud)

我可以很容易地根据 Y 对 X 进行排序:

XY_sort = [x for _,x in sorted(zip(Y,X))]
print(XY_sort)  # ["a", "d", "h", "b", "c", "e", "i", "f", "g"]
Run Code Online (Sandbox Code Playgroud)

当我想根据产生 XY_sort 的排序对列表 Z 进行排序时,就会出现疑问。理想情况下,我想结束:

Z_sort = [5,   1,   0,   2,   3,   4,   7,   9,   6]
Run Code Online (Sandbox Code Playgroud)

我猜最好的方法是在 X 被排序到 XY_sort 时以某种方式存储它的排序索引,然后使用它们对 …

python sorting list

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

检查 value 是否变为 1 并保持为 1

例子:

(0, 0, 1, 1)    => True (becomes 1 and remains 1)
(0, 0, 0)       => False (never becomes 1)
(0, 1, 1, 0, 1) => False (becomes 1 but goes back to 0)
(1, 1, 1)       => True (ok to become 1 right away)
Run Code Online (Sandbox Code Playgroud)

我有一个有限生成器,它0为“未完成”和1“完成”提供信号值。它应该达到“完成”,然后保持“完成”。我想检查一下。

这是一个示例生成器(带有硬编码值)以及我想如何使用它:

def signal():
    yield from (0, 0, 1, 1)

>>> check(signal())
True
Run Code Online (Sandbox Code Playgroud)

我有一个解决方案,但它看起来又长又复杂。一定会有更好的办法!欢迎任何和所有想法。

def check(s):
    done = False
    for x in s:
        if x:
            done = True
            break
    if not …
Run Code Online (Sandbox Code Playgroud)

python

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