迭代和串联2个列表占用大量内存

时间:2019-03-15 18:44:08

标签: python python-3.x pandas list iterator

在Python 3中,我试图从4个列表中生成这种格式的序列

<yyyymmdd>-<1-200>-<1-20>-<1-13000>

20161201-1-1-1
20161201-1-1-2
20161201-1-1-3
..
..
20161201-1-2-1
20161201-1-2-2
..
..
20161201-2-1-1
20161201-2-1-2
..
20161202-1-1-1
20161202-1-1-2
..
..
20190701-200-20-13000

第一个列表的日期范围为<yyyymmdd to yyyymmdd>,其余3个列表的范围为<1-200> <1-20> and <1-13000>

所有列表值均为str格式。

现在我正在尝试以下操作:

import itertools
import pandas as pd

all_dates = [d.strftime('%Y%m%d') for d in pd.date_range('20160119','20191226')]
all_users = list(range(0,200))
all_products = list(range(0,15))
all_customers = list(range(0,13000))

date_user_product_map = []
date_user_product_customer_map = []

for pair in itertools.product(all_dates,all_users, all_products):
    date_user_product_map.append('-'.join(pair))

for pair in itertools.product(date_user_product_map,all_customers):
    date_user_product_customer_map.append('-'.join(pair))

3个列表的第一个串联是快速且内存不足。 第二个串联只是占用大量内存并被杀死。

我也尝试在48 gig RAM系统上运行它,但是似乎没有足够的内存来运行它。

在解决此问题以及理解为什么需要这么多内存的过程中,我需要一些帮助。我在这里做什么错了?

更新(我的要求)

因此,我有几个数据帧,这些数据帧的列很少,其值的格式为-<1-200>-<1-20>-<1-13000>,这会占用大量空间,因此我想要创建所有可能值的列表,然后枚举并创建如下字典:

-<1-200>-<1-20>-<1-13000>

20161201-1-1-1:0 20161201-1-1-2:1 20161201-1-1-3:2 .. .. 20190701-200-20-12999:n-1 20190701-200-20-13000:n

,然后将数据帧的值替换为1,2 ... n,n-1。

还有其他方法吗?

2 个答案:

答案 0 :(得分:2)

您不需要将这些范围转换为列表。

您应该执行以下操作:

import itertools
import pandas as pd

all_dates = (d.strftime('%Y%m%d') for d in pd.date_range('20160119','20191226'))
all_users = range(0,200)
all_products = range(0,15)
all_customers = range(0,13000)

date_user_product_pairs = ( '-'.join(pair) for pair in itertools.product(all_dates,all_users, all_products))

date_user_product_customer_pairs = ( '-'.join(pair) for pair in itertools.product(date_user_product_map,all_customers))

然后,您可以使用这些对生成器来获取所需的内容。

答案 1 :(得分:1)

只需使用一个生成器表达式:

return await User.query()
.joinRelation('recognitions')
.where('organization_id', organizationID)
.select(
    'user_id',
    'profile_photo_name',
    'first_name',
    'last_name',
    raw('COUNT(*) as count')
)
.groupBy('user_id')
.orderBy('count', 'desc')
.first()

使用方式:

sequences = ('-'.join(str(x) for x in p) for p in itertools.product(all_dates,all_users,all_products, all_customers))