[pypy-commit] benchmarks default: add an nqueens multithreaded benchmark

Raemi noreply at buildbot.pypy.org
Tue Jul 15 14:30:05 CEST 2014


Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch: 
Changeset: r265:dd64736032e4
Date: 2014-07-15 14:31 +0200
http://bitbucket.org/pypy/benchmarks/changeset/dd64736032e4/

Log:	add an nqueens multithreaded benchmark

diff --git a/multithread/nqueens/nqueens.py b/multithread/nqueens/nqueens.py
new file mode 100644
--- /dev/null
+++ b/multithread/nqueens/nqueens.py
@@ -0,0 +1,68 @@
+# -*- coding: utf-8 -*-
+# Based on code from http://code.activestate.com/recipes/576647/
+# by Raymond Hettinger
+#
+# It is a bit problematic because find_solutions spends half
+# of the execution time constructing the permutations. Thus
+# only half the execution is parallelised.
+
+
+import sys
+import time, random
+from common.abstract_threading import (
+    atomic, Future, set_thread_pool, ThreadPool,
+    hint_commit_soon)
+
+from itertools import permutations
+import itertools
+
+
+def chunks(iterable, size):
+    it = iter(iterable)
+    item = list(itertools.islice(it, size))
+    while item:
+        yield item
+        item = list(itertools.islice(it, size))
+
+
+
+def check_solutions(n, cols, perms):
+    sols = []
+    with atomic:
+        for vec in perms:
+            if n == len(set(vec[i]+i for i in cols)) \
+               == len(set(vec[i]-i for i in cols)):
+                sols.append(vec)
+    return sols
+
+
+def find_solutions(n):
+    solutions = []
+    fs = []
+    cols = range(n)
+    for perms in chunks(permutations(cols), 100000):
+        hint_commit_soon()
+        fs.append(Future(check_solutions, n, cols, perms))
+    print "Futures:", len(fs)
+    for f in fs:
+        solutions.extend(f())
+
+    print "found:", len(solutions)
+
+
+def run(threads=2, n=10):
+    threads = int(threads)
+    n = int(n)
+
+    set_thread_pool(ThreadPool(threads))
+
+    find_solutions(n)
+
+
+    # shutdown current pool
+    set_thread_pool(None)
+
+
+
+if __name__ == "__main__":
+    run()


More information about the pypy-commit mailing list