psf / pyperf

Toolkit to run Python benchmarks
http://pyperf.readthedocs.io/
MIT License
771 stars 74 forks source link

Minor optimizations by using comprehensions #182

Closed cclauss closed 3 months ago

cclauss commented 3 months ago

% ruff check --select=C4,PERF --ignore=PERF203

pyperf/__main__.py:355:21: PERF401 Use a list comprehension to create a transformed list
pyperf/_bench.py:563:21: PERF401 Use a list comprehension to create a transformed list
pyperf/_compare.py:168:13: PERF401 Use a list comprehension to create a transformed list
pyperf/_compare.py:253:21: C414 Unnecessary `list` call within `sorted()`
pyperf/_compare.py:285:13: PERF401 Use a list comprehension to create a transformed list
pyperf/_compare.py:432:13: PERF401 Use a list comprehension to create a transformed list
pyperf/_cpu_utils.py:94:17: PERF402 Use `list` or `list.copy` to create a copy of a list
pyperf/_utils.py:133:21: PERF402 Use `list` or `list.copy` to create a copy of a list
pyperf/tests/test_bench.py:351:13: PERF401 Use a list comprehension to create a transformed list
Found 9 errors.

% ruff rule PERF401

manual-list-comprehension (PERF401)

Derived from the Perflint linter.

What it does

Checks for for loops that can be replaced by a list comprehension.

Why is this bad?

When creating a transformed list from an existing list using a for-loop, prefer a list comprehension. List comprehensions are more readable and more performant.

Using the below as an example, the list comprehension is ~10% faster on Python 3.11, and ~25% faster on Python 3.10.

Note that, as with all perflint rules, this is only intended as a micro-optimization, and will have a negligible impact on performance in most cases.

Example

original = list(range(10000))
filtered = []
for i in original:
    if i % 2:
        filtered.append(i)

Use instead:

original = list(range(10000))
filtered = [x for x in original if x % 2]

If you're appending to an existing list, use the extend method instead:

original = list(range(10000))
filtered.extend(x for x in original if x % 2)
corona10 commented 3 months ago

ditto: https://github.com/psf/pyperf/pull/183#issuecomment-2081878177

vstinner commented 3 months ago

I suggest to ignore this recommendation instead of trying to address it just because ruff thinks that the code is slow.