1from pybench import Test
2
3class PythonFunctionCalls(Test):
4
5    version = 2.0
6    operations = 5*(1+4+4+2)
7    rounds = 60000
8
9    def test(self):
10
11        global f,f1,g,h
12
13        # define functions
14        def f():
15            pass
16
17        def f1(x):
18            pass
19
20        def g(a,b,c):
21            return a,b,c
22
23        def h(a,b,c,d=1,e=2,f=3):
24            return d,e,f
25
26        # do calls
27        for i in xrange(self.rounds):
28
29            f()
30            f1(i)
31            f1(i)
32            f1(i)
33            f1(i)
34            g(i,i,i)
35            g(i,i,i)
36            g(i,i,i)
37            g(i,i,i)
38            h(i,i,3,i,i)
39            h(i,i,i,2,i,3)
40
41            f()
42            f1(i)
43            f1(i)
44            f1(i)
45            f1(i)
46            g(i,i,i)
47            g(i,i,i)
48            g(i,i,i)
49            g(i,i,i)
50            h(i,i,3,i,i)
51            h(i,i,i,2,i,3)
52
53            f()
54            f1(i)
55            f1(i)
56            f1(i)
57            f1(i)
58            g(i,i,i)
59            g(i,i,i)
60            g(i,i,i)
61            g(i,i,i)
62            h(i,i,3,i,i)
63            h(i,i,i,2,i,3)
64
65            f()
66            f1(i)
67            f1(i)
68            f1(i)
69            f1(i)
70            g(i,i,i)
71            g(i,i,i)
72            g(i,i,i)
73            g(i,i,i)
74            h(i,i,3,i,i)
75            h(i,i,i,2,i,3)
76
77            f()
78            f1(i)
79            f1(i)
80            f1(i)
81            f1(i)
82            g(i,i,i)
83            g(i,i,i)
84            g(i,i,i)
85            g(i,i,i)
86            h(i,i,3,i,i)
87            h(i,i,i,2,i,3)
88
89    def calibrate(self):
90
91        global f,f1,g,h
92
93        # define functions
94        def f():
95            pass
96
97        def f1(x):
98            pass
99
100        def g(a,b,c):
101            return a,b,c
102
103        def h(a,b,c,d=1,e=2,f=3):
104            return d,e,f
105
106        # do calls
107        for i in xrange(self.rounds):
108            pass
109
110###
111
112class ComplexPythonFunctionCalls(Test):
113
114    version = 2.0
115    operations = 4*5
116    rounds = 100000
117
118    def test(self):
119
120        # define functions
121        def f(a,b,c,d=1,e=2,f=3):
122            return f
123
124        args = 1,2
125        kwargs = dict(c=3,d=4,e=5)
126
127        # do calls
128        for i in xrange(self.rounds):
129            f(a=i,b=i,c=i)
130            f(f=i,e=i,d=i,c=2,b=i,a=3)
131            f(1,b=i,**kwargs)
132            f(*args,**kwargs)
133
134            f(a=i,b=i,c=i)
135            f(f=i,e=i,d=i,c=2,b=i,a=3)
136            f(1,b=i,**kwargs)
137            f(*args,**kwargs)
138
139            f(a=i,b=i,c=i)
140            f(f=i,e=i,d=i,c=2,b=i,a=3)
141            f(1,b=i,**kwargs)
142            f(*args,**kwargs)
143
144            f(a=i,b=i,c=i)
145            f(f=i,e=i,d=i,c=2,b=i,a=3)
146            f(1,b=i,**kwargs)
147            f(*args,**kwargs)
148
149            f(a=i,b=i,c=i)
150            f(f=i,e=i,d=i,c=2,b=i,a=3)
151            f(1,b=i,**kwargs)
152            f(*args,**kwargs)
153
154
155    def calibrate(self):
156
157        # define functions
158        def f(a,b,c,d=1,e=2,f=3):
159            return f
160
161        args = 1,2
162        kwargs = dict(c=3,d=4,e=5)
163
164        # do calls
165        for i in xrange(self.rounds):
166            pass
167
168###
169
170class BuiltinFunctionCalls(Test):
171
172    version = 2.0
173    operations = 5*(2+5+5+5)
174    rounds = 60000
175
176    def test(self):
177
178        # localize functions
179        f0 = globals
180        f1 = hash
181        f2 = cmp
182        f3 = range
183
184        # do calls
185        for i in xrange(self.rounds):
186
187            f0()
188            f0()
189            f1(i)
190            f1(i)
191            f1(i)
192            f1(i)
193            f1(i)
194            f2(1,2)
195            f2(1,2)
196            f2(1,2)
197            f2(1,2)
198            f2(1,2)
199            f3(1,3,2)
200            f3(1,3,2)
201            f3(1,3,2)
202            f3(1,3,2)
203            f3(1,3,2)
204
205            f0()
206            f0()
207            f1(i)
208            f1(i)
209            f1(i)
210            f1(i)
211            f1(i)
212            f2(1,2)
213            f2(1,2)
214            f2(1,2)
215            f2(1,2)
216            f2(1,2)
217            f3(1,3,2)
218            f3(1,3,2)
219            f3(1,3,2)
220            f3(1,3,2)
221            f3(1,3,2)
222
223            f0()
224            f0()
225            f1(i)
226            f1(i)
227            f1(i)
228            f1(i)
229            f1(i)
230            f2(1,2)
231            f2(1,2)
232            f2(1,2)
233            f2(1,2)
234            f2(1,2)
235            f3(1,3,2)
236            f3(1,3,2)
237            f3(1,3,2)
238            f3(1,3,2)
239            f3(1,3,2)
240
241            f0()
242            f0()
243            f1(i)
244            f1(i)
245            f1(i)
246            f1(i)
247            f1(i)
248            f2(1,2)
249            f2(1,2)
250            f2(1,2)
251            f2(1,2)
252            f2(1,2)
253            f3(1,3,2)
254            f3(1,3,2)
255            f3(1,3,2)
256            f3(1,3,2)
257            f3(1,3,2)
258
259            f0()
260            f0()
261            f1(i)
262            f1(i)
263            f1(i)
264            f1(i)
265            f1(i)
266            f2(1,2)
267            f2(1,2)
268            f2(1,2)
269            f2(1,2)
270            f2(1,2)
271            f3(1,3,2)
272            f3(1,3,2)
273            f3(1,3,2)
274            f3(1,3,2)
275            f3(1,3,2)
276
277    def calibrate(self):
278
279        # localize functions
280        f0 = dir
281        f1 = hash
282        f2 = range
283        f3 = range
284
285        # do calls
286        for i in xrange(self.rounds):
287            pass
288
289###
290
291class PythonMethodCalls(Test):
292
293    version = 2.0
294    operations = 5*(6 + 5 + 4)
295    rounds = 30000
296
297    def test(self):
298
299        class c:
300
301            x = 2
302            s = 'string'
303
304            def f(self):
305
306                return self.x
307
308            def j(self,a,b):
309
310                self.y = a
311                self.t = b
312                return self.y
313
314            def k(self,a,b,c=3):
315
316                self.y = a
317                self.s = b
318                self.t = c
319
320        o = c()
321
322        for i in xrange(self.rounds):
323
324            o.f()
325            o.f()
326            o.f()
327            o.f()
328            o.f()
329            o.f()
330            o.j(i,i)
331            o.j(i,i)
332            o.j(i,2)
333            o.j(i,2)
334            o.j(2,2)
335            o.k(i,i)
336            o.k(i,2)
337            o.k(i,2,3)
338            o.k(i,i,c=4)
339
340            o.f()
341            o.f()
342            o.f()
343            o.f()
344            o.f()
345            o.f()
346            o.j(i,i)
347            o.j(i,i)
348            o.j(i,2)
349            o.j(i,2)
350            o.j(2,2)
351            o.k(i,i)
352            o.k(i,2)
353            o.k(i,2,3)
354            o.k(i,i,c=4)
355
356            o.f()
357            o.f()
358            o.f()
359            o.f()
360            o.f()
361            o.f()
362            o.j(i,i)
363            o.j(i,i)
364            o.j(i,2)
365            o.j(i,2)
366            o.j(2,2)
367            o.k(i,i)
368            o.k(i,2)
369            o.k(i,2,3)
370            o.k(i,i,c=4)
371
372            o.f()
373            o.f()
374            o.f()
375            o.f()
376            o.f()
377            o.f()
378            o.j(i,i)
379            o.j(i,i)
380            o.j(i,2)
381            o.j(i,2)
382            o.j(2,2)
383            o.k(i,i)
384            o.k(i,2)
385            o.k(i,2,3)
386            o.k(i,i,c=4)
387
388            o.f()
389            o.f()
390            o.f()
391            o.f()
392            o.f()
393            o.f()
394            o.j(i,i)
395            o.j(i,i)
396            o.j(i,2)
397            o.j(i,2)
398            o.j(2,2)
399            o.k(i,i)
400            o.k(i,2)
401            o.k(i,2,3)
402            o.k(i,i,c=4)
403
404    def calibrate(self):
405
406        class c:
407
408            x = 2
409            s = 'string'
410
411            def f(self):
412
413                return self.x
414
415            def j(self,a,b):
416
417                self.y = a
418                self.t = b
419
420            def k(self,a,b,c=3):
421
422                self.y = a
423                self.s = b
424                self.t = c
425
426        o = c
427
428        for i in xrange(self.rounds):
429            pass
430
431###
432
433class Recursion(Test):
434
435    version = 2.0
436    operations = 5
437    rounds = 100000
438
439    def test(self):
440
441        global f
442
443        def f(x):
444
445            if x > 1:
446                return f(x-1)
447            return 1
448
449        for i in xrange(self.rounds):
450            f(10)
451            f(10)
452            f(10)
453            f(10)
454            f(10)
455
456    def calibrate(self):
457
458        global f
459
460        def f(x):
461
462            if x > 0:
463                return f(x-1)
464            return 1
465
466        for i in xrange(self.rounds):
467            pass
468
469
470### Test to make Fredrik happy...
471
472if __name__ == '__main__':
473    import timeit
474    if 0:
475        timeit.TestClass = PythonFunctionCalls
476        timeit.main(['-s', 'test = TestClass(); test.rounds = 1000',
477                     'test.test()'])
478    else:
479        setup = """\
480global f,f1,g,h
481
482# define functions
483def f():
484    pass
485
486def f1(x):
487    pass
488
489def g(a,b,c):
490    return a,b,c
491
492def h(a,b,c,d=1,e=2,f=3):
493    return d,e,f
494
495i = 1
496"""
497        test = """\
498f()
499f1(i)
500f1(i)
501f1(i)
502f1(i)
503g(i,i,i)
504g(i,i,i)
505g(i,i,i)
506g(i,i,i)
507h(i,i,3,i,i)
508h(i,i,i,2,i,3)
509
510f()
511f1(i)
512f1(i)
513f1(i)
514f1(i)
515g(i,i,i)
516g(i,i,i)
517g(i,i,i)
518g(i,i,i)
519h(i,i,3,i,i)
520h(i,i,i,2,i,3)
521
522f()
523f1(i)
524f1(i)
525f1(i)
526f1(i)
527g(i,i,i)
528g(i,i,i)
529g(i,i,i)
530g(i,i,i)
531h(i,i,3,i,i)
532h(i,i,i,2,i,3)
533
534f()
535f1(i)
536f1(i)
537f1(i)
538f1(i)
539g(i,i,i)
540g(i,i,i)
541g(i,i,i)
542g(i,i,i)
543h(i,i,3,i,i)
544h(i,i,i,2,i,3)
545
546f()
547f1(i)
548f1(i)
549f1(i)
550f1(i)
551g(i,i,i)
552g(i,i,i)
553g(i,i,i)
554g(i,i,i)
555h(i,i,3,i,i)
556h(i,i,i,2,i,3)
557"""
558
559        timeit.main(['-s', setup,
560                     test])
561