blob: 33d78fb4e6dc7bd1b99ed5647d33660c80d064b0 [file] [log] [blame]
Henry Schreinerd8c7ee02020-07-20 13:35:21 -04001# -*- coding: utf-8 -*-
Wenzel Jakob5cd33112015-10-20 00:58:59 +02002import random
3import os
4import time
5import datetime as dt
6
7nfns = 4 # Functions per class
8nargs = 4 # Arguments per function
9
10
11def generate_dummy_code_pybind11(nclasses=10):
12 decl = ""
13 bindings = ""
14
15 for cl in range(nclasses):
16 decl += "class cl%03i;\n" % cl
Henry Schreinerc50f90e2020-10-16 16:38:13 -040017 decl += "\n"
Wenzel Jakob5cd33112015-10-20 00:58:59 +020018
19 for cl in range(nclasses):
20 decl += "class cl%03i {\n" % cl
21 decl += "public:\n"
22 bindings += ' py::class_<cl%03i>(m, "cl%03i")\n' % (cl, cl)
23 for fn in range(nfns):
24 ret = random.randint(0, nclasses - 1)
Henry Schreinerc50f90e2020-10-16 16:38:13 -040025 params = [random.randint(0, nclasses - 1) for i in range(nargs)]
Wenzel Jakob5cd33112015-10-20 00:58:59 +020026 decl += " cl%03i *fn_%03i(" % (ret, fn)
27 decl += ", ".join("cl%03i *" % p for p in params)
28 decl += ");\n"
Henry Schreinerc50f90e2020-10-16 16:38:13 -040029 bindings += ' .def("fn_%03i", &cl%03i::fn_%03i)\n' % (fn, cl, fn)
Wenzel Jakob5cd33112015-10-20 00:58:59 +020030 decl += "};\n\n"
Henry Schreinerc50f90e2020-10-16 16:38:13 -040031 bindings += " ;\n"
Wenzel Jakob5cd33112015-10-20 00:58:59 +020032
33 result = "#include <pybind11/pybind11.h>\n\n"
34 result += "namespace py = pybind11;\n\n"
Henry Schreinerc50f90e2020-10-16 16:38:13 -040035 result += decl + "\n"
Dean Moldovan443ab592017-04-24 01:51:44 +020036 result += "PYBIND11_MODULE(example, m) {\n"
Wenzel Jakob5cd33112015-10-20 00:58:59 +020037 result += bindings
Wenzel Jakob5cd33112015-10-20 00:58:59 +020038 result += "}"
39 return result
40
41
42def generate_dummy_code_boost(nclasses=10):
43 decl = ""
44 bindings = ""
45
46 for cl in range(nclasses):
47 decl += "class cl%03i;\n" % cl
Henry Schreinerc50f90e2020-10-16 16:38:13 -040048 decl += "\n"
Wenzel Jakob5cd33112015-10-20 00:58:59 +020049
50 for cl in range(nclasses):
51 decl += "class cl%03i {\n" % cl
52 decl += "public:\n"
53 bindings += ' py::class_<cl%03i>("cl%03i")\n' % (cl, cl)
54 for fn in range(nfns):
55 ret = random.randint(0, nclasses - 1)
Henry Schreinerc50f90e2020-10-16 16:38:13 -040056 params = [random.randint(0, nclasses - 1) for i in range(nargs)]
Wenzel Jakob5cd33112015-10-20 00:58:59 +020057 decl += " cl%03i *fn_%03i(" % (ret, fn)
58 decl += ", ".join("cl%03i *" % p for p in params)
59 decl += ");\n"
Henry Schreinerc50f90e2020-10-16 16:38:13 -040060 bindings += (
61 ' .def("fn_%03i", &cl%03i::fn_%03i, py::return_value_policy<py::manage_new_object>())\n'
62 % (fn, cl, fn)
63 )
Wenzel Jakob5cd33112015-10-20 00:58:59 +020064 decl += "};\n\n"
Henry Schreinerc50f90e2020-10-16 16:38:13 -040065 bindings += " ;\n"
Wenzel Jakob5cd33112015-10-20 00:58:59 +020066
67 result = "#include <boost/python.hpp>\n\n"
68 result += "namespace py = boost::python;\n\n"
Henry Schreinerc50f90e2020-10-16 16:38:13 -040069 result += decl + "\n"
Wenzel Jakob5cd33112015-10-20 00:58:59 +020070 result += "BOOST_PYTHON_MODULE(example) {\n"
71 result += bindings
72 result += "}"
73 return result
74
75
76for codegen in [generate_dummy_code_pybind11, generate_dummy_code_boost]:
Henry Schreinerc50f90e2020-10-16 16:38:13 -040077 print("{")
Wenzel Jakob5cd33112015-10-20 00:58:59 +020078 for i in range(0, 10):
79 nclasses = 2 ** i
80 with open("test.cpp", "w") as f:
81 f.write(codegen(nclasses))
82 n1 = dt.datetime.now()
Henry Schreinerc50f90e2020-10-16 16:38:13 -040083 os.system(
84 "g++ -Os -shared -rdynamic -undefined dynamic_lookup "
Wenzel Jakob66c9a402016-01-17 22:36:36 +010085 "-fvisibility=hidden -std=c++14 test.cpp -I include "
Henry Schreinerc50f90e2020-10-16 16:38:13 -040086 "-I /System/Library/Frameworks/Python.framework/Headers -o test.so"
87 )
Wenzel Jakob5cd33112015-10-20 00:58:59 +020088 n2 = dt.datetime.now()
89 elapsed = (n2 - n1).total_seconds()
Henry Schreinerc50f90e2020-10-16 16:38:13 -040090 size = os.stat("test.so").st_size
Wenzel Jakob5cd33112015-10-20 00:58:59 +020091 print(" {%i, %f, %i}," % (nclasses * nfns, elapsed, size))
Henry Schreinerc50f90e2020-10-16 16:38:13 -040092 print("}")