在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:我的代码避免了每次读取文件,也避免了每次将集合转换为列表或元组。