【发布时间】:2021-11-13 02:27:31
【问题描述】:
我有一个包含 250k 个项目的数据集,这些项目在添加到列表/生成器之前需要满足某些条件。为了加快处理速度,我想使用生成器,但我不确定是否使用产生过滤样本的函数过滤数据,或者我是否应该将过滤后的样本返回到生成器对象等。我想最终对象仅包含满足过滤条件的样本,但默认情况下 python 将返回/产生一个 NoneType 对象。我已经包含了示例过滤器函数、数据(真正的问题使用字符串,但为简单起见,我使用随机正态分布的浮点数),以及我打算如何处理下面的数据。
在这种情况下我应该如何有效地使用生成器?为此目的使用生成器是否合乎逻辑/有效?我知道我可以检查返回函数中的元素是否为 None 以将其从容器(列表/生成器)中排除,但是如何使用产生值的函数来执行此操作?
# For random data
import numpy as np
# Functions
def filter_and_yield(item_in_data):
if item_in_data > 0.0:
yield item_in_data
def filter_and_return(item_in_data):
if item_in_data > 0.0:
return item_in_data
# Arbitrary data
num_samples = 250 * 10**3
data = np.random.normal(size=(num_samples,))
# Should I use this: generator with generator elements?
filtered_data_as_gen_with_gen_elements = (filter_and_yield(item) for item in data)
# Should I use this: list with generator elements?
filtered_data_as_lst_with_gen_elements = [filter_and_yield(item) for item in data]
# Should I use this: generator with non-generator elements?
filtered_data_as_gen_with_non_gen_elements = (
filter_and_return(item) for item in data if filter_and_return(item) is not None)
# Should I use this: list with non-generator elements?
filtered_data_as_lst_with_non_gen_elements = [
filter_and_return(item) for item in data if filter_and_return(item) is not None]
# Saving the data as csv -- note, `filtered_data` is NOT defined
# but is a place holder for whatever correct way of filtering the data is
df = pd.DataFrame({'filtered_data': filtered_data})
df.to_csv('./filtered_data.csv')
【问题讨论】:
-
这取决于过滤是什么。最好自己处理 in numpy (即调用数组上的方法),而不是对每个元素进行 python 迭代。在您的示例中,每个值都需要从有效的硬件级整数转换为 python int,然后是一个 exprensive 函数调用。对于 numpy 和 pandas,您希望尽可能多地使用它们的 ufunc。
-
tdelaney:我不知道这一点,将进一步调查。谢谢。
-
你可以改用
df = pd.DataFrame({'filtered_data': data[data > 0.0]})。它为data创建一个 true.false 掩码,然后过滤掉 false。
标签: python pandas performance generator