为什么我的numpy.random.choice实现更快?

阿米尔·沙巴尼(Amir A. Shabani)

我想实现numpy.random.choice(除了replace参数之外)以了解它是如何工作的。

这是我想出的

from random import uniform
from math import fsum

def select(array, total_count, probability):
    probability_accumulative = []
    last_element = 0
    for i in range(len(probability)):
        probability_accumulative.append(last_element + probability[i])
        last_element = probability_accumulative[i]

    result = []

    if(len(array) != len(probability)):
        raise ValueError("array and probability must have the same size.")
    elif(fsum(probability) != 1.0):
        raise ValueError("probabilities do not sum to 1.")
    else:
        for i in range(total_count):
            rand = uniform(0, 1)
            for j in range(len(probability_accumulative)):
                if(rand < probability_accumulative[j]):
                    result.append(array[j])
                    break

    return result

看起来效果很好,所以我决定编写另一个脚本来检查与相比,我的实现要慢多少numpy.random.choice

这是我为此编写的测试脚本

from random_selection import select
from collections import Counter
from numpy.random import choice
from time import time

def test(array, total_count, probability, method):
    methods = {
        "numpy.random.choice": choice(array, total_count, p=probability),
        "random_selection.select": select(array, total_count, probability)
    }

    if(method in methods):
        probability_dict = {}
        rand_items = methods[method]
        items_counter = Counter(rand_items)

        for item, count in items_counter.most_common():
            probability_dict[item] = f"{100 * count / total_count:.1f}%"
        return probability_dict
    else:
        raise ValueError(f"Method {method} has not been defined.")


def main():
    total_count = 1000000
    array = ['a', 'b', 'c', 'd']
    probability = [0.7, 0.1, 0.1, 0.1]

    print(f"array: {array}")
    print(f"probability: {probability}")
    print(f"size: {total_count}")

    print()

    print('random_selection.select: ')
    start_time = time()
    result = test(array, total_count, probability, 'random_selection.select')
    end_time = time()
    print(result)
    print(f"{(end_time - start_time):.4f} s")

    print()

    print('numpy.random.choice: ')
    start_time = time()
    result = test(array, total_count, probability, 'numpy.random.choice')
    end_time = time()
    print(result)
    print(f"{(end_time - start_time):.4f} s")


if __name__ == "__main__":
    main()

看到我的实现更快,我感到非常惊讶!

这是一百万个数组大小的结果:

array: ['a', 'b', 'c', 'd']
probability: [0.7, 0.1, 0.1, 0.1]
size: 1000000

random_selection.select:
{'a': '70.0%', 'c': '10.0%', 'd': '10.0%', 'b': '10.0%'}
2.5119 s

numpy.random.choice:
{'a': '70.0%', 'b': '10.0%', 'd': '10.0%', 'c': '10.0%'}
3.1098 s

如果我将规模增加到1000万,差异会变得更加明显:

array: ['a', 'b', 'c', 'd']
probability: [0.7, 0.1, 0.1, 0.1]
size: 10000000

random_selection.select:
{'a': '70.0%', 'b': '10.0%', 'd': '10.0%', 'c': '10.0%'}
25.6174 s

numpy.random.choice:
{'a': '70.0%', 'b': '10.0%', 'c': '10.0%', 'd': '10.0%'}
31.8087 s

这是为什么?

布莱克金

您的测试代码无法实现您期望的功能。test功能一直呼吁双方你的两个随机选择功能。您的时间安排只能检测出与所需功能相对应的结果在分析代码上的性能差异。

问题在于以下几行:

methods = {
    "numpy.random.choice": choice(array, total_count, p=probability),
    "random_selection.select": select(array, total_count, probability)
}

这些无条件调用choiceselect函数,并将返回的值放入字典中。几乎可以肯定这不是您所期望的。您可能想将一个lambda函数放入字典,该字典在调用时使用适当的参数来调用所需的函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么numpy.random.choice这么慢?

来自分类Dev

为什么numpy.random.binomial(1,nan)= -9223372036854775807?

来自分类Dev

枚举上的random.choice

来自分类Dev

如何获取numpy.random.choice的索引?-蟒蛇

来自分类Dev

NumPy-更快实现阈值上限的方法

来自分类Dev

如何使我的std :: vector实现更快?

来自分类Dev

是否有numpy.random.shuffle的更快版本?

来自分类Dev

为什么我的实现不是O(NlogN)?

来自分类Dev

为什么我的Trait实现不匹配?

来自分类Dev

为什么没有OpenBLAS的numpy / scipy更快?

来自分类Dev

为什么写入/ dev / random不能使从/ dev / random的并行读取更快?

来自分类Dev

即使我正在使用np.random.choice(),也为什么要一遍又一遍地获得相同的输入?

来自分类Dev

为什么random.shuffle在numpy列表上失败?

来自分类Dev

为什么random.choices比NumPy的随机选择要快?

来自分类Dev

Python random.seed()和numpy.random.seed()实现彼此不同吗?

来自分类Dev

我何时应该选择random.choice()而不是random.randint?

来自分类Dev

为什么numpy.random.choice不使用算术编码?

来自分类Dev

什么是numpy random.RandomState

来自分类Dev

为什么写入/ dev / random不能使从/ dev / random的并行读取更快?

来自分类Dev

为什么在使用dd时我的/ dev / random这么慢?

来自分类Dev

为什么Canvas的实现比Pixi.JS更快?

来自分类Dev

是否有numpy.random.shuffle的更快版本?

来自分类Dev

为什么.Net实现Random.Next(int,int)要求maxValue> = minValue?

来自分类Dev

如果/ dev / random被实现为伪设备,为什么不是“是”?

来自分类Dev

numpy-使用np.random.choice从矩阵重复采样

来自分类Dev

Python如何从集合中实现random.choice()?

来自分类Dev

为什么Matlab矩阵求逆比numpy更快?

来自分类Dev

为什么 numpy random reshuffle 在 numpy 数组上不起作用?

来自分类Dev

为什么我们将对 numpy.random.random 的调用乘以数字并减去数字?

Related 相关文章

  1. 1

    为什么numpy.random.choice这么慢?

  2. 2

    为什么numpy.random.binomial(1,nan)= -9223372036854775807?

  3. 3

    枚举上的random.choice

  4. 4

    如何获取numpy.random.choice的索引?-蟒蛇

  5. 5

    NumPy-更快实现阈值上限的方法

  6. 6

    如何使我的std :: vector实现更快?

  7. 7

    是否有numpy.random.shuffle的更快版本?

  8. 8

    为什么我的实现不是O(NlogN)?

  9. 9

    为什么我的Trait实现不匹配?

  10. 10

    为什么没有OpenBLAS的numpy / scipy更快?

  11. 11

    为什么写入/ dev / random不能使从/ dev / random的并行读取更快?

  12. 12

    即使我正在使用np.random.choice(),也为什么要一遍又一遍地获得相同的输入?

  13. 13

    为什么random.shuffle在numpy列表上失败?

  14. 14

    为什么random.choices比NumPy的随机选择要快?

  15. 15

    Python random.seed()和numpy.random.seed()实现彼此不同吗?

  16. 16

    我何时应该选择random.choice()而不是random.randint?

  17. 17

    为什么numpy.random.choice不使用算术编码?

  18. 18

    什么是numpy random.RandomState

  19. 19

    为什么写入/ dev / random不能使从/ dev / random的并行读取更快?

  20. 20

    为什么在使用dd时我的/ dev / random这么慢?

  21. 21

    为什么Canvas的实现比Pixi.JS更快?

  22. 22

    是否有numpy.random.shuffle的更快版本?

  23. 23

    为什么.Net实现Random.Next(int,int)要求maxValue> = minValue?

  24. 24

    如果/ dev / random被实现为伪设备,为什么不是“是”?

  25. 25

    numpy-使用np.random.choice从矩阵重复采样

  26. 26

    Python如何从集合中实现random.choice()?

  27. 27

    为什么Matlab矩阵求逆比numpy更快?

  28. 28

    为什么 numpy random reshuffle 在 numpy 数组上不起作用?

  29. 29

    为什么我们将对 numpy.random.random 的调用乘以数字并减去数字?

热门标签

归档