回答編集履歴

2

2020/07/17 04:29

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -20,7 +20,7 @@
20
20
 
21
21
  idx = cartesian([np.arange(length) for length in lens])
22
22
 
23
- offset = np.concatenate(([0], lens.cumsum()[:-1]))
23
+ offset = lens.cumsum() - lens
24
24
 
25
25
 
26
26
 

1

追記

2020/07/17 04:29

投稿

kirara0048
kirara0048

スコア1399

test CHANGED
@@ -1,4 +1,4 @@
1
- コードを整理すればもっといい方法があるかもしれませんが、いかがでしょうか。`itertools.product`より速いと思われます(特に各要素が数値なら)。
1
+ コードを整理すればもっといい方法があるかもしれませんが、以下の方法でいかがでしょうか。`itertools.product`より速いと思われます(特に各要素が数値なら)。
2
2
 
3
3
 
4
4
 
@@ -34,7 +34,7 @@
34
34
 
35
35
 
36
36
 
37
- 動作確認
37
+ ## 動作確認
38
38
 
39
39
 
40
40
 
@@ -217,3 +217,67 @@
217
217
  # (後略)
218
218
 
219
219
  ```
220
+
221
+
222
+
223
+ ## 速度比較
224
+
225
+
226
+
227
+ ```python
228
+
229
+ In [21]: def df_product_itertools(df_list):
230
+
231
+ : lsts = [df.to_numpy().tolist() for df in df_list]
232
+
233
+ : new_list = [reduce(add, e) for e in itertools.product(*lsts)]
234
+
235
+ : return pd.DataFrame(new_list, columns=np.concatenate(
236
+
237
+ : [df.columns.to_numpy() for df in df_list]))
238
+
239
+
240
+
241
+ In [22]: l_1 = [[1, 2], [3, 4]]
242
+
243
+ : l_2 = [[11, 22], [33, 44]]
244
+
245
+ : l_3 = [[111, 222], [333, 444]]
246
+
247
+ : l_4 = [[1111, 2222], [3333, 4444]]
248
+
249
+ : l_5 = [[11111, 22222], [33333, 44444]]
250
+
251
+ :
252
+
253
+ : df1 = pd.DataFrame(l_1, columns=['A', 'B'])
254
+
255
+ : df2 = pd.DataFrame(l_2, columns=['C', 'D'])
256
+
257
+ : df3 = pd.DataFrame(l_3, columns=['E', 'F'])
258
+
259
+ : df4 = pd.DataFrame(l_4, columns=['G', 'H'])
260
+
261
+ : df5 = pd.DataFrame(l_5, columns=['I', 'J'])
262
+
263
+
264
+
265
+ In [23]: %timeit df_product([df1, df2, df3, df4])
266
+
267
+ : %timeit df_product_itertools([df1, df2, df3, df4])
268
+
269
+ 355 µs ± 18.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
270
+
271
+ 928 µs ± 16.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
272
+
273
+
274
+
275
+ In [24]: %timeit df_product([df1, df2, df3, df4, df5])
276
+
277
+ : %timeit df_product_itertools([df1, df2, df3, df4, df5])
278
+
279
+ 378 µs ± 12.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
280
+
281
+ 1.12 ms ± 17.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
282
+
283
+ ```