1 | #!/usr/bin/env python2
|
2 | """
|
3 | length.py
|
4 | """
|
5 | from __future__ import print_function
|
6 |
|
7 | import os
|
8 | from mycpp.mylib import log
|
9 | from mycpp import mylib
|
10 |
|
11 | from typing import Optional
|
12 |
|
13 |
|
14 | def TestMaybeStrEquals():
|
15 | # type: () -> None
|
16 |
|
17 | a = 'foo'
|
18 | b = 'bar'
|
19 |
|
20 | y = 'foo' # type: Optional[str]
|
21 | n = None # type: Optional[str]
|
22 |
|
23 | log('a == b -> %d', a == b)
|
24 | log('a != b -> %d', a != b)
|
25 |
|
26 | log('a == y -> %d', a == y)
|
27 | log('a != y -> %d', a != y)
|
28 |
|
29 | log('a == n -> %d', a == n)
|
30 | log('a != n -> %d', a != n)
|
31 |
|
32 |
|
33 | def run_tests():
|
34 | # type: () -> None
|
35 | mystr = 'abcd'
|
36 | log("len(mystr) = %d", len(mystr))
|
37 | log("mystr[1] = %s", mystr[1])
|
38 | log("mystr[1:] = %s", mystr[1:])
|
39 | log("mystr[1:3] = %s", mystr[1:3])
|
40 | log("mystr[:-2] = %s", mystr[:-2])
|
41 |
|
42 | for c in mystr:
|
43 | if c == 'b':
|
44 | continue
|
45 | log('c = %s', c)
|
46 | if c == 'c':
|
47 | break
|
48 |
|
49 | log("")
|
50 |
|
51 | # NOTE: Not implementing mylist[:n] or mylist[:-1] (negative) until I see
|
52 | # usages.
|
53 | mylist = ['w', 'x', 'y', 'z']
|
54 | log("len(mylist) = %d", len(mylist))
|
55 | log("mylist[1] = %s", mylist[1])
|
56 |
|
57 | # can't print lists directly
|
58 | log("len(mylist[1:]) = %d", len(mylist[1:]))
|
59 |
|
60 | for c in mylist:
|
61 | if c == 'x':
|
62 | continue
|
63 | log('c = %s', c)
|
64 | if c == 'y':
|
65 | break
|
66 |
|
67 | # to test nullptr. Python correctly infers this as 'str'
|
68 | c2 = None # type: Optional[str]
|
69 | for c2 in mystr:
|
70 | if c2 != 'a': # test != operator
|
71 | log('%s != a', c2)
|
72 |
|
73 | log('')
|
74 |
|
75 | TestMaybeStrEquals()
|
76 |
|
77 |
|
78 | def run_benchmarks():
|
79 | # type: () -> None
|
80 | n = 1000000
|
81 |
|
82 | mystr = 'abcd'
|
83 | mylist = ['w', 'x', 'y', 'z']
|
84 |
|
85 | result = 0
|
86 | i = 0
|
87 | while i < n:
|
88 | # C++ has a big advantage here
|
89 | #result += len(mystr)
|
90 | #result += len(mylist)
|
91 |
|
92 | # C++ shows no real advantage here
|
93 | result += len(mystr[1:])
|
94 | result += len(mylist[1:])
|
95 |
|
96 | i += 1
|
97 |
|
98 | mylib.MaybeCollect()
|
99 |
|
100 | log('result = %d', result)
|
101 | log('iterations = %d', n)
|
102 |
|
103 |
|
104 | if __name__ == '__main__':
|
105 | if os.getenv('BENCHMARK'):
|
106 | log('Benchmarking...')
|
107 | run_benchmarks()
|
108 | else:
|
109 | run_tests()
|