Skip to content

Commit 930d65e

Browse files
author
Release Manager
committed
gh-36308: using itertools.product more often
This replaces some uses of our `cartesian_product_iterator` by `itertools.product`, for better efficiency. ### 📝 Checklist - [x] The title is concise, informative, and self-explanatory. - [x] The description explains in detail what this PR is about. URL: #36308 Reported by: Frédéric Chapoton Reviewer(s): Marc Mezzarobba
2 parents 9ea5127 + ef273be commit 930d65e

File tree

17 files changed

+51
-57
lines changed

17 files changed

+51
-57
lines changed

build/pkgs/configure/checksums.ini

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
tarball=configure-VERSION.tar.gz
2-
sha1=b2c2a31975aecc02df78e38082e915419c3354e6
3-
md5=2441f31fbe9e5a3ca1f6070fcee5e42c
4-
cksum=4212643350
2+
sha1=b6d662b1301c2ef342d28ffa22c6f09be4ead821
3+
md5=e7ed474499cb651b218ef6ab4f1b3285
4+
cksum=1633939417
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
f32860b2015ad42b5cb9c30a0af1351e597bf314
1+
821c5f5d7e9ab1476094459252ae9b42de71cf98

src/sage/combinat/cluster_algebra_quiver/quiver.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@
3636
# Distributed under the terms of the GNU General Public License (GPL)
3737
# https://www.gnu.org/licenses/
3838
# ****************************************************************************
39-
4039
from copy import copy
40+
from itertools import product
4141

4242
from sage.structure.sage_object import SageObject
4343
from sage.rings.integer_ring import ZZ
@@ -46,7 +46,6 @@
4646
from sage.graphs.graph import Graph
4747
from sage.graphs.views import EdgesView
4848
from sage.arith.misc import gcd
49-
from sage.categories.cartesian_product import cartesian_product
5049
from sage.misc.misc_c import prod
5150
from sage.misc.lazy_import import lazy_import
5251
from sage.rings.rational_field import QQ
@@ -2109,8 +2108,8 @@ def poincare_semistable(self, theta, d):
21092108
mu_d = theta.dot_product(d) / sum(d)
21102109

21112110
Li = [0 * d]
2112-
it = (vector(e) for e in cartesian_product([range(d_i + 1)
2113-
for d_i in d]))
2111+
it = (vector(e) for e in product(*[range(d_i + 1)
2112+
for d_i in d]))
21142113
Li += [e for e in it if e.dot_product(theta) > mu_d * sum(e)]
21152114
Li.append(d)
21162115
N = len(Li) - 1

src/sage/combinat/constellation.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848
# (at your option) any later version.
4949
# https://www.gnu.org/licenses/
5050
# ****************************************************************************
51-
from itertools import repeat
51+
from itertools import repeat, product
52+
5253
from sage.structure.element import parent
5354
from sage.structure.parent import Parent
5455
from sage.structure.element import Element
@@ -1408,17 +1409,14 @@ def __iter__(self):
14081409
g1 ('a','d','b')('c')
14091410
g2 ('a','b')('c','d')
14101411
"""
1411-
from sage.misc.mrange import cartesian_product_iterator
1412-
14131412
if self._cd._length == 1:
14141413
if self._cd._degree == 1:
14151414
yield self([[0]])
14161415
return
14171416

14181417
S = self._cd._sym
14191418
profile = list(self._profile)[:-1]
1420-
for p in cartesian_product_iterator([S.conjugacy_class(pi)
1421-
for pi in profile]):
1419+
for p in product(*[S.conjugacy_class(pi) for pi in profile]):
14221420
if self._cd._connected and not perms_are_connected(p, self._cd._degree):
14231421
continue
14241422
c = self._cd(list(p) + [None], check=False)

src/sage/combinat/diagram.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
# (at your option) any later version.
2424
# https://www.gnu.org/licenses/
2525
# ****************************************************************************
26+
from itertools import product
2627

2728
from sage.categories.infinite_enumerated_sets import InfiniteEnumeratedSets
2829
from sage.combinat.composition import Composition
@@ -1523,8 +1524,7 @@ def RotheDiagram(w):
15231524

15241525
N = w.size()
15251526
winv = w.inverse()
1526-
from sage.misc.mrange import cartesian_product_iterator
1527-
cells = [c for c in cartesian_product_iterator((range(N), range(N)))
1527+
cells = [c for c in product(range(N), range(N))
15281528
if c[0] + 1 < winv(c[1] + 1) and c[1] + 1 < w(c[0] + 1)]
15291529

15301530
return NorthwestDiagram(cells, n_rows=N, n_cols=N, check=False)

src/sage/combinat/posets/posets.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@
288288
from __future__ import annotations
289289
from collections import defaultdict
290290
from copy import copy, deepcopy
291+
from itertools import product
291292
from typing import List
292293

293294
from sage.misc.cachefunc import cached_method
@@ -5296,7 +5297,6 @@ def factor(self):
52965297
Discrete Applied Mathematics 15 (1986) 105-110
52975298
:doi:`10.1016/0166-218X(86)90023-5`
52985299
"""
5299-
from sage.misc.mrange import cartesian_product_iterator
53005300
from sage.graphs.graph import Graph
53015301
from sage.misc.flatten import flatten
53025302
dg = self._hasse_diagram
@@ -5327,7 +5327,7 @@ def edge_color(va, vb):
53275327
if edge_color(x, y) == i0]
53285328
neigh1 = [z for z in prod_dg.neighbor_iterator(x)
53295329
if edge_color(x, z) == i1]
5330-
for x0, x1 in cartesian_product_iterator([neigh0, neigh1]):
5330+
for x0, x1 in product(neigh0, neigh1):
53315331
x2 = list(x0)
53325332
x2[i1] = x1[i1]
53335333
x2 = tuple(x2)

src/sage/groups/abelian_gps/abelian_group.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@
201201
# (at your option) any later version.
202202
# https://www.gnu.org/licenses/
203203
# ****************************************************************************
204+
from itertools import product
204205

205206
from sage.arith.functions import lcm
206207
from sage.arith.misc import divisors, gcd
@@ -211,7 +212,7 @@
211212
from sage.matrix.special import diagonal_matrix
212213
from sage.misc.cachefunc import cached_method
213214
from sage.misc.misc_c import prod
214-
from sage.misc.mrange import cartesian_product_iterator, mrange
215+
from sage.misc.mrange import mrange
215216
from sage.modules.free_module_element import vector
216217
from sage.rings.infinity import infinity
217218
from sage.rings.integer import Integer
@@ -1498,7 +1499,7 @@ def subgroups(self, check=False):
14981499
# H = the subgroup of *index* H.
14991500
its = [range(0, H, H // gcd(H, G.gen(i).order()))
15001501
for i in range(ngens)]
1501-
for f in cartesian_product_iterator(its):
1502+
for f in product(*its):
15021503
verbose("using hom from G to C_%s sending gens to %s" % (H, f))
15031504
new_sub = []
15041505
for a in range(ngens):

src/sage/modular/multiple_zeta.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,11 @@
168168
from __future__ import annotations
169169
import numbers
170170
from typing import Iterator
171+
from itertools import product
171172

172173
from sage.misc.fast_methods import Singleton
173174
from sage.structure.richcmp import op_EQ, op_NE
174175
from sage.structure.element import parent
175-
from sage.categories.cartesian_product import cartesian_product
176176
from sage.categories.graded_algebras_with_basis import GradedAlgebrasWithBasis
177177
from sage.categories.rings import Rings
178178
from sage.categories.domains import Domains
@@ -578,7 +578,7 @@ def extend_multiplicative_basis(B, n) -> Iterator:
578578
[((7,),), ((5,), (2,)), ((3,), (2,), (2,))]
579579
"""
580580
for pi in Partitions(n, min_part=2):
581-
yield from cartesian_product([B[i] for i in pi])
581+
yield from product(*[B[i] for i in pi])
582582

583583

584584
# several classes for the algebra of MZV

src/sage/modules/fg_pid/fgp_module.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@
211211
# (at your option) any later version.
212212
# https://www.gnu.org/licenses/
213213
# ****************************************************************************
214+
from itertools import product
214215

215216
from sage.modules.module import Module
216217
from sage.modules.free_module import is_FreeModule
@@ -1835,8 +1836,7 @@ def __iter__(self):
18351836
raise NotImplementedError("currently self must be finite to iterate over")
18361837
B = self.optimized()[0].V().basis_matrix()
18371838
V = self.base_ring()**B.nrows()
1838-
from sage.misc.mrange import cartesian_product_iterator
1839-
for a in cartesian_product_iterator([range(k) for k in v]):
1839+
for a in product(*[range(k) for k in v]):
18401840
b = V(a) * B
18411841
yield self(b)
18421842

src/sage/schemes/affine/affine_rational_point.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@
5050
# (at your option) any later version.
5151
# https://www.gnu.org/licenses/
5252
# ****************************************************************************
53+
from itertools import product
5354

5455
from sage.rings.integer_ring import ZZ
5556
from sage.rings.rational_field import QQ
56-
from sage.misc.mrange import cartesian_product_iterator
5757
from sage.schemes.generic.scheme import is_Scheme
5858

5959

@@ -300,7 +300,7 @@ def enum_affine_finite_field(X):
300300
n = X.codomain().ambient_space().ngens()
301301
F = X.value_ring()
302302
pts = []
303-
for c in cartesian_product_iterator([F] * n):
303+
for c in product(*([F] * n)):
304304
try:
305305
pts.append(X(c))
306306
except Exception:

0 commit comments

Comments
 (0)