Skip to content

Commit 1d1f776

Browse files
committed
Update Algorithms
1 parent 0ef92dd commit 1d1f776

File tree

13 files changed

+809
-380
lines changed

13 files changed

+809
-380
lines changed

.idea/workspace.xml

Lines changed: 555 additions & 359 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Util.py

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import pickle
44
import numpy as np
55
from abc import ABCMeta
6-
from copy import deepcopy
76
from math import pi, sqrt, ceil
87
import matplotlib.pyplot as plt
98

@@ -236,7 +235,7 @@ def wrapper(func, instance, args, kwargs):
236235
def timings(self):
237236
return self._timings
238237

239-
def show_timing_log(self, level):
238+
def show_timing_log(self, level=2):
240239
print()
241240
print("=" * 110 + "\n" + "Timing log\n" + "-" * 110)
242241
if not self.timings:
@@ -358,10 +357,44 @@ def start(self):
358357
self._flush()
359358

360359

360+
class TimingMeta(type):
361+
def __new__(mcs, *args, **kwargs):
362+
name, bases, attr = args[:3]
363+
try:
364+
_timing = attr[name + "Timing"]
365+
except KeyError:
366+
_timing = Timing()
367+
attr[name + "Timing"] = _timing
368+
369+
for _name, _value in attr.items():
370+
if "__" in _name or "timing" in _name or "estimate" in _name:
371+
continue
372+
_str_val = str(_value)
373+
if "<" not in _str_val and ">" not in _str_val:
374+
continue
375+
if _str_val.find("function") >= 0 or _str_val.find("staticmethod") >= 0 or _str_val.find("property") >= 0:
376+
attr[_name] = _timing.timeit(level=2)(_value)
377+
378+
def feed_timing(self, timing):
379+
setattr(self, name + "Timing", timing)
380+
381+
def show_timing_log(self, level=2):
382+
getattr(self, name + "Timing").show_timing_log(level)
383+
384+
attr["feed_timing"] = feed_timing
385+
attr["show_timing_log"] = show_timing_log
386+
387+
return type(name, bases, attr)
388+
389+
361390
class ClassifierMeta(type):
362391
def __new__(mcs, *args, **kwargs):
363392
name, bases, attr = args[:3]
364-
clf_timing = attr[name + "Timing"]
393+
try:
394+
clf_timing = attr[name + "Timing"]
395+
except KeyError:
396+
clf_timing = Timing()
397+
attr[name + "Timing"] = clf_timing
365398

366399
def __str__(self):
367400
try:
@@ -441,12 +474,22 @@ def show_timing_log(self, level=2):
441474
return type(name, bases, attr)
442475

443476

444-
class TimingMeta(type):
477+
class SubClassTimingMeta(type):
445478
def __new__(mcs, *args, **kwargs):
446479
name, bases, attr = args[:3]
447-
timing = getattr(bases[0], bases[0].__name__ + "Timing")
448-
attr = {_name: timing.timeit(level=2)(_value) if "__" not in _name else _value
449-
for _name, _value in attr.items()}
480+
try:
481+
timing = getattr(bases[0], bases[0].__name__ + "Timing")
482+
except AttributeError:
483+
timing = Timing()
484+
setattr(bases[0], bases[0].__name__ + "Timing", timing)
485+
for _name, _value in attr.items():
486+
if "__" in _name or "timing" in _name or "estimate" in _name:
487+
continue
488+
_str_val = str(_value)
489+
if "<" not in _str_val and ">" not in _str_val:
490+
continue
491+
if _str_val.find("function") >= 0 or _str_val.find("staticmethod") >= 0 or _str_val.find("property") >= 0:
492+
attr[_name] = timing.timeit(level=2)(_value)
450493
return type(name, bases, attr)
451494

452495

Zhihu/Python/Utils/clf_metas.py

Lines changed: 58 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,47 @@
33
from abc import ABCMeta
44
import matplotlib.pyplot as plt
55

6+
from Util import Timing
7+
8+
9+
class TimingMeta(type):
10+
def __new__(mcs, *args, **kwargs):
11+
name, bases, attr = args[:3]
12+
try:
13+
_timing = attr[name + "Timing"]
14+
except KeyError:
15+
_timing = Timing()
16+
attr[name + "Timing"] = _timing
17+
18+
for _name, _value in attr.items():
19+
if "__" in _name or "timing" in _name or "estimate" in _name:
20+
continue
21+
_str_val = str(_value)
22+
if "<" not in _str_val and ">" not in _str_val:
23+
continue
24+
if _str_val.find("function") >= 0 or _str_val.find("staticmethod") >= 0 or _str_val.find("property") >= 0:
25+
attr[_name] = _timing.timeit(level=2)(_value)
26+
27+
def feed_timing(self, timing):
28+
setattr(self, name + "Timing", timing)
29+
30+
def show_timing_log(self, level=2):
31+
getattr(self, name + "Timing").show_timing_log(level)
32+
33+
attr["feed_timing"] = feed_timing
34+
attr["show_timing_log"] = show_timing_log
35+
36+
return type(name, bases, attr)
37+
638

739
class ClassifierMeta(type):
840
def __new__(mcs, *args, **kwargs):
941
name, bases, attr = args[:3]
10-
clf_timing = attr[name + "Timing"]
42+
try:
43+
clf_timing = attr[name + "Timing"]
44+
except KeyError:
45+
clf_timing = Timing()
46+
attr[name + "Timing"] = clf_timing
1147

1248
def __str__(self):
1349
try:
@@ -27,7 +63,12 @@ def estimate(self, x, y):
2763
print("Acc: {:8.6} %".format(100 * np.sum(self.predict(x) == np.array(y)) / len(y)))
2864

2965
def visualize2d(self, x, y, dense=100):
30-
axis, y = np.array(x).T, np.array(y)
66+
length = len(x)
67+
axis = np.array([[.0] * length, [.0] * length])
68+
for i, xx in enumerate(x):
69+
axis[0][i] = xx[0]
70+
axis[1][i] = xx[1]
71+
xs, ys = np.array(x), np.array(y)
3172

3273
print("=" * 30 + "\n" + str(self))
3374
decision_function = lambda _xx: self.predict(_xx)
@@ -62,7 +103,7 @@ def get_base(_nx, _ny):
62103
plt.figure()
63104
plt.pcolormesh(xy_xf, xy_yf, z > 0, cmap=plt.cm.Paired)
64105
plt.contour(xf, yf, z, c='k-', levels=[0])
65-
plt.scatter(axis[0], axis[1], c=[colors[yy] for yy in y])
106+
plt.scatter(axis[0], axis[1], c=[colors[y] for y in ys])
66107
plt.xlim(x_min, x_max)
67108
plt.ylim(y_min, y_max)
68109
plt.show()
@@ -82,12 +123,22 @@ def show_timing_log(self, level=2):
82123
return type(name, bases, attr)
83124

84125

85-
class TimingMeta(type):
126+
class SubClassTimingMeta(type):
86127
def __new__(mcs, *args, **kwargs):
87128
name, bases, attr = args[:3]
88-
timing = getattr(bases[0], bases[0].__name__ + "Timing")
89-
attr = {_name: timing.timeit(level=2)(_value) if "__" not in _name else _value
90-
for _name, _value in attr.items()}
129+
try:
130+
timing = getattr(bases[0], bases[0].__name__ + "Timing")
131+
except AttributeError:
132+
timing = Timing()
133+
setattr(bases[0], bases[0].__name__ + "Timing", timing)
134+
for _name, _value in attr.items():
135+
if "__" in _name or "timing" in _name or "estimate" in _name:
136+
continue
137+
_str_val = str(_value)
138+
if "<" not in _str_val and ">" not in _str_val:
139+
continue
140+
if _str_val.find("function") >= 0 or _str_val.find("staticmethod") >= 0 or _str_val.find("property") >= 0:
141+
attr[_name] = timing.timeit(level=2)(_value)
91142
return type(name, bases, attr)
92143

93144

Zhihu/Python/Utils/timing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def wrapper(func, instance, args, kwargs):
4747
def timings(self):
4848
return self._timings
4949

50-
def show_timing_log(self, level):
50+
def show_timing_log(self, level=2):
5151
print()
5252
print("=" * 110 + "\n" + "Timing log\n" + "-" * 110)
5353
if not self.timings:

Zhihu/Python/timing_meta_example.py

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
import time
2+
import wrapt
3+
4+
5+
class Timing:
6+
_timings = {}
7+
_enabled = False
8+
9+
def __init__(self, enabled=True):
10+
Timing._enabled = enabled
11+
12+
def __str__(self):
13+
return "Timing"
14+
15+
__repr__ = __str__
16+
17+
@staticmethod
18+
def timeit(level=0, name=None, cls_name=None, prefix="[Method] "):
19+
@wrapt.decorator
20+
def wrapper(func, instance, args, kwargs):
21+
if not Timing._enabled:
22+
return func(*args, **kwargs)
23+
if instance is not None:
24+
instance_name = "{:>18s}".format(str(instance))
25+
else:
26+
instance_name = " " * 18 if cls_name is None else "{:>18s}".format(cls_name)
27+
_prefix = "{:>26s}".format(prefix)
28+
func_name = "{:>28}".format(func.__name__ if name is None else name)
29+
_name = instance_name + _prefix + func_name
30+
_t = time.time()
31+
rs = func(*args, **kwargs)
32+
_t = time.time() - _t
33+
try:
34+
Timing._timings[_name]["timing"] += _t
35+
Timing._timings[_name]["call_time"] += 1
36+
except KeyError:
37+
Timing._timings[_name] = {
38+
"level": level,
39+
"timing": _t,
40+
"call_time": 1
41+
}
42+
return rs
43+
44+
return wrapper
45+
46+
@property
47+
def timings(self):
48+
return self._timings
49+
50+
def show_timing_log(self, level=2):
51+
print()
52+
print("=" * 110 + "\n" + "Timing log\n" + "-" * 110)
53+
if not self.timings:
54+
print("None")
55+
else:
56+
for key in sorted(self.timings.keys()):
57+
timing_info = self.timings[key]
58+
if level >= timing_info["level"]:
59+
print("{:<42s} : {:12.7} s (Call Time: {:6d})".format(
60+
key, timing_info["timing"], timing_info["call_time"]))
61+
print("-" * 110)
62+
63+
64+
class TimingBase:
65+
def feed_timing(self, timing):
66+
pass
67+
68+
def show_timing_log(self, level=2):
69+
pass
70+
71+
72+
class TimingMeta(type):
73+
def __new__(mcs, *args, **kwargs):
74+
name, bases, attr = args[:3]
75+
try:
76+
_timing = attr[name + "Timing"]
77+
except KeyError:
78+
_timing = Timing()
79+
attr[name + "Timing"] = _timing
80+
81+
for _name, _value in attr.items():
82+
if "__" in _name or "timing" in _name or "estimate" in _name:
83+
continue
84+
_str_val = str(_value)
85+
if "<" not in _str_val and ">" not in _str_val:
86+
continue
87+
if _str_val.find("function") >= 0 or _str_val.find("staticmethod") >= 0 or _str_val.find("property") >= 0:
88+
attr[_name] = _timing.timeit(level=2)(_value)
89+
90+
def feed_timing(self, timing):
91+
setattr(self, name + "Timing", timing)
92+
93+
def show_timing_log(self, level=2):
94+
getattr(self, name + "Timing").show_timing_log(level)
95+
96+
attr["feed_timing"] = feed_timing
97+
attr["show_timing_log"] = show_timing_log
98+
99+
return type(name, bases, attr)
100+
101+
102+
class Test(TimingBase, metaclass=TimingMeta):
103+
104+
@staticmethod
105+
def test1():
106+
for i in range(10 ** 7):
107+
pass
108+
109+
@staticmethod
110+
def test2():
111+
for i in range(10 ** 7):
112+
_ = 1
113+
114+
@staticmethod
115+
def test3():
116+
for i in range(10 ** 7):
117+
pass
118+
pass
119+
120+
@staticmethod
121+
def test4():
122+
for i in range(10 ** 7):
123+
_ = 1
124+
_ = 2
125+
126+
@staticmethod
127+
def test5():
128+
for i in range(10 ** 7):
129+
_ = 1
130+
_ = 1
131+
132+
if __name__ == '__main__':
133+
test = Test()
134+
test.test1()
135+
test.test2()
136+
test.test3()
137+
test.test4()
138+
test.test5()
139+
test.show_timing_log()

__pycache__/Util.cpython-35.pyc

1.25 KB
Binary file not shown.
Binary file not shown.

b_NaiveBayes/Vectorized/GaussianNB.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import matplotlib.pyplot as plt
22

33
from b_NaiveBayes.Vectorized.Basic import *
4-
from Util import TimingMeta
4+
from Util import SubClassTimingMeta
55

66

7-
class GaussianNB(NaiveBayes, metaclass=TimingMeta):
7+
class GaussianNB(NaiveBayes, metaclass=SubClassTimingMeta):
88

99
def feed_data(self, x, y, sample_weights=None):
1010
if sample_weights is not None:

b_NaiveBayes/Vectorized/MergedNB.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from b_NaiveBayes.Vectorized.Basic import *
22
from b_NaiveBayes.Vectorized.MultinomialNB import MultinomialNB
33
from b_NaiveBayes.Vectorized.GaussianNB import GaussianNB
4-
from Util import DataUtil, TimingMeta
4+
from Util import DataUtil, SubClassTimingMeta
55

66

7-
class MergedNB(NaiveBayes, metaclass=TimingMeta):
7+
class MergedNB(NaiveBayes, metaclass=SubClassTimingMeta):
88

99
def __init__(self, whether_continuous=None):
1010
NaiveBayes.__init__(self)

b_NaiveBayes/Vectorized/MultinomialNB.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
import matplotlib.pyplot as plt
22

33
from b_NaiveBayes.Vectorized.Basic import *
4-
from Util import DataUtil, TimingMeta
4+
from Util import DataUtil, SubClassTimingMeta
55

66

7-
class MultinomialNB(NaiveBayes, metaclass=TimingMeta):
7+
class MultinomialNB(NaiveBayes, metaclass=SubClassTimingMeta):
88

99
def feed_data(self, x, y, sample_weights=None):
1010
if sample_weights is not None:

0 commit comments

Comments
 (0)