【问题标题】:Writing a fast function to check elements in a matrix编写一个快速函数来检查矩阵中的元素
【发布时间】:2019-09-20 06:31:56
【问题描述】:

我正在尝试编写一个函数来检查矩阵中的元素并以布尔值返回另一个结果矩阵。

输入:

X: 二维年龄数组列表,如上所述。

输出:

该函数应返回一个二维数组,其中的条目为 0 或 1,如上所述。

该函数的运行速度必须比这个快 15 倍:

def check_elems(X):
    out = [[0]*len(X[0]) for _ in range(len(X))]
    for i in range(len(X)):
        for j in range(len(X[i])):
            check = X[i][j]
            if check>=14 and check%5==4 and check!=19:
                out[i][j] = 1
    return out

这是一个具体的例子:

  • 此人至少 14 岁
  • 人的年龄以 4 或 9 结尾
  • 而且这个人不是 19 岁

例如一个年龄数组

[[22, 13, 31, 13],
 [17, 14, 24, 22]]

会有输出数组:

[[0, 0, 0, 0], 
 [0, 1, 1, 0]]

【问题讨论】:

  • 你试过 numpy 了吗?
  • 你在这里问什么问题?
  • 这是什么蟒蛇?

标签: python list algorithm performance sorting


【解决方案1】:

没有 numpy:

X = [[22, 13, 31, 13],
     [17, 14, 24, 22]]

%timeit check_elems(X)
%timeit [[1 if i%5==4 and i>=14 and i!=19 else 0 for i in l] for l in X]

使用标准笔记本电脑:

每个循环 2.16 µs ± 15 ns(平均值 ± 标准偏差,7 次运行,每次 100000 次循环)

每个循环 911 ns ± 2.23 ns(平均值 ± 标准偏差,7 次运行,每次 1000000 次循环)

编辑

正如@user3386109 所指出的,前面的代码不满足 OP 要求的 15 倍快 约束,我不知何故误读为 1.5 倍。我将我的代码作为基线。

【讨论】:

  • 速度是原来的两倍,这很好。但几乎没有问题要求的改进。
  • 你好,我也想测试一下我的代码,这次你是怎么跑的?
猜你喜欢
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
相关资源
最近更新 更多