在python中从集合中获取随机int以及如何提高性能

在python中从集合中获取随机int以及如何提高性能,python,random,set,Python,Random,Set,我实际上使用下面的代码从集合中获取一个随机整数。但是这个集合很大,所以随机选择的速度非常慢。还有更好的办法吗 def getRandomBook(): return int(random.sample(getBookSet(),1)[0]) def getBookSet(cleaned_sales_input = "data/cleaned_sales.csv"): with open(cleaned_sales_input, "rb") as sales_file:

我实际上使用下面的代码从集合中获取一个随机整数。但是这个集合很大,所以随机选择的速度非常慢。还有更好的办法吗

def getRandomBook():
    return int(random.sample(getBookSet(),1)[0])


def getBookSet(cleaned_sales_input = "data/cleaned_sales.csv"):
    with open(cleaned_sales_input, "rb") as sales_file:
        sales = csv.reader(sales_file)
        return {int(row[6]) for row in sales}
只读取一次文件,并将集合转换为列表;
random.sample()
实现已经将一个集合转换为元组,以便能够选择一个样本。避免这种开销,只需使用
random.choice()

books = None

def getRandomBook():
    global books
    if books is None:
        books = list(getBookSet())
    return random.choice(books)
无需调用
int()
,因为您已经转换了读取值

这至少加快了在重复调用
getRandomBook()
时拾取随机值的速度。如果每次运行程序时只需要调用一次,那么除了创建一个具有唯一图书值的简单文件外,没有其他方法可以解决此问题。

只读取一次文件,并将集合转换为列表;
random.sample()
实现已经将一个集合转换为元组,以便能够选择一个样本。避免这种开销,只需使用
random.choice()

books = None

def getRandomBook():
    global books
    if books is None:
        books = list(getBookSet())
    return random.choice(books)
无需调用
int()
,因为您已经转换了读取值


这至少加快了在重复调用
getRandomBook()
时拾取随机值的速度。如果每次运行程序时只需要调用一次,那么除了创建一个仅具有唯一书本值的简单文件之外,没有其他方法可以解决此问题。

速度如此缓慢的原因可能不是选择,而是每次调用
getRandomBook()
函数时都要重新读取CSV文件。如果您需要多次调用它,请考虑改写代码,以便只读取一次文件。如此慢的可能不是选择,而是每次调用您的代码> GeTrand Word Booor()/<代码>函数时,都会重新读取CSV文件。如果您需要多次调用它,请考虑改写代码,以便只读取一次文件。为什么<代码>随机。示例< /COD>和<代码>随机。选择< /代码>?他能不能只调用
random.choice
,不管从
getBookSet
中得到什么,因为他只想要一个呢?@PauloAlmeida:OP使用的是
random.sample()
,因为该函数支持从
set()
对象中选择,而
random.choice()
不支持。当我在我的同一点复制你的代码时,我在第340行第5列遇到一个奇怪的错误“return”。正在期待一个“(“…”)”。。。"[" ... "," ... "." ... "+" ... "-" ... "*" ... "/" ... "//" ... "" ... "%" ... "^" ... "|" ... "&" ... ">" ... "@SvenBamberger:return上的语法错误?是的,我忘记了前一行的右括号,现在更正了。@PauloAlmeida:我的代码避免每次读取文件,也避免每次将集合转换为列表或元组。为什么
random.sample
random.choice
?他不能调用
random.cho吗ice
对从
getBookSet
出来的任何东西都有效,因为他只想要一个?@PauloAlmeida:OP使用的是
random.sample()
,因为该函数支持从
set()
对象中拾取,而
random.choice()
不支持。当我在我的同一点复制你的代码时,我会遇到一个奇怪的错误第340行第5列的“return”应为“(“…”)”[“…”,“…”+“…”-“…*”/“…/”…”%“…”^“…”|“…”&“…”>”之一@SvenBamberger:return上的语法错误?是的,我忘记了前一行的右括号,现在更正了。@PauloAlmeida:我的代码避免了每次读取文件,也避免了每次将集合转换为列表或元组。