Python Interpreters Benchmarks
x64 ArchLinux : AMD® Ryzen 7 4700U®

 performance measurements

Each table row shows performance measurements for this program with a particular command-line input value N.

 N  CPU secs Elapsed secs Memory KB Code B ≈ CPU Load

Read the ↓ make, command line, and program output logs to see how this program was run.

Read  benchmark to see what this program should do.

 notes

  source code

# The Computer Language Benchmarks Game
# http://benchmarksgame.alioth.debian.org/
#
# contributed by Jacek Pliszka
# algorithm is based on Java 6 source code by Oleg Mazurov
# source is based on Miroslav Rubanets' C++ submission.
# converted to python by Ian P. Cooke
# converted to generators by Jacek Pliszka

import sys
import math
from multiprocessing import cpu_count, Pool

cdef int MAX_PROBLEM_SIZE, MAX_CPU_LIMIT

MAX_PROBLEM_SIZE = 12
MAX_CPU_LIMIT = 4


def PermutationGenerator(int length, int idx):
    cdef int i, d

    count = [0] * length
    perm = list(range(length))

    for i in range(length - 1, 0, -1):
        d, idx = divmod(idx, math.factorial(i))
        count[i] = d
        perm[:i+1-d], perm[i+1-d:i+1] = perm[d:i+1], perm[:d]  # rotate

    yield perm  # first permutation

    while 1:
        perm[0], perm[1] = perm[1], perm[0]   # rotate
        count[1] += 1
        i = 1
        while count[i] > i:
            count[i] = 0
            i += 1
            if i >= length:
                break
            count[i] += 1
            perm[:i], perm[i] = perm[1:i+1], perm[0]  # rotate

        yield perm


def task_body(parms):
    cdef int maxflips, checksum

    g = PermutationGenerator(parms[0], parms[1])

    maxflips = 0
    checksum = 0
    for i in range(parms[1], parms[2]):
        data = list(g.next() if sys.version_info[0] < 3 else g.__next__())
        f = data[0]
        if f > 0:
            flips = 0
            while f:
                data[:f+1] = data[f::-1]  # reverse
                flips += 1
                f = data[0]
            maxflips = max(maxflips, flips)
            checksum += -flips if i % 2 else flips

    return maxflips, checksum

usage = """usage fannkuchredux number
number has to be in range [3-12]\n"""


def main():
    cdef int length, n, index_max, index_step

    if len(sys.argv) < 2:
        print(usage)
        return 1

    length = int(sys.argv[1])
    if length < 3 or length > MAX_PROBLEM_SIZE:
        print(usage)
        return 2

    n = min(cpu_count(), MAX_CPU_LIMIT)

    index_max = math.factorial(length)
    index_step = (index_max + n-1) // n

    parms = [(length, i, i + index_step) for i in range(0, index_max, index_step)]

    processors = Pool(processes=n)
    res = list(zip(*processors.map(task_body, parms)))

    processors.close()
    processors.join()
    processors.terminate()

    print("%d\nPfannkuchen(%d) = %d" % (sum(res[1]), length, max(res[0])))
    return 0

main()

 make, command-line, and program output logs

 Sun, 23 Apr 2023 09:02:59 GMT

MAKE:
make[1]: Vstupuje se do adresáře „/home/dundee/work/pybenchmarks/bencher/tmp/fannkuchredux/tmp“
cp fannkuchredux.cython `echo fannkuchredux.cython | sed 's/cython-..//' | sed 's/.cython//'`.pyx
cythonize -3 -bi `echo fannkuchredux.cython | sed 's/cython-..//' | sed 's/.cython//'`.pyx
Compiling /home/dundee/work/pybenchmarks/bencher/tmp/fannkuchredux/tmp/fannkuchredux.pyx because it changed.
[1/1] Cythonizing /home/dundee/work/pybenchmarks/bencher/tmp/fannkuchredux/tmp/fannkuchredux.pyx
make[1]: Opouští se adresář „/home/dundee/work/pybenchmarks/bencher/tmp/fannkuchredux/tmp“
4.31s to complete and log all make actions

COMMAND LINE:
 /usr/bin/python3 -c "import fannkuchredux" 10

TIMED OUT after 300s


PROGRAM OUTPUT:

Revised BSD license

  Home   Conclusions   License   Play