Skip to content

Commit ac64dd9

Browse files
committed
timeit and web terminal
1 parent 44c49a0 commit ac64dd9

File tree

3 files changed

+217
-0
lines changed

3 files changed

+217
-0
lines changed

timeit.py

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# This is an implementation of timeit module, as a practice
2+
import itertools
3+
import gc
4+
5+
_template = """
6+
def run_timer(it, _timer):
7+
%s
8+
_start = _timer.time()
9+
for _i in it:
10+
%s
11+
_end = _timer.time()
12+
return _end - _start
13+
"""
14+
15+
def get_runner(f, _setup):
16+
def run_timer(it, _timer):
17+
_setup()
18+
_start = _timer.time()
19+
for _i in it:
20+
f()
21+
_end = _timer.time()
22+
return _end - _start
23+
return run_timer
24+
25+
class Timer(object):
26+
def __init__(self, target="pass", setup="pass"):
27+
self._target = target
28+
self._setup = setup
29+
ns = {}
30+
if isinstance(target, basestring):
31+
if isinstance(setup, basestring):
32+
src = _template%(setup, target)
33+
elif callable(setup):
34+
src = _template%("_setup()", target)
35+
ns["_setup"] = setup
36+
else:
37+
raise ValueError("Needs a callable or python statement")
38+
# print src
39+
code = compile(src, "_dummy_", "exec")
40+
exec code in globals(), ns
41+
self.runner = ns['run_timer']
42+
elif callable(target):
43+
if isinstance(setup, basestring):
44+
def temp():
45+
exec setup in globals(), ns
46+
self.runner = get_runner(target, temp)
47+
elif callable(setup):
48+
self.runner = get_runner(target, setup)
49+
else:
50+
raise ValueError("target must be statement for callable")
51+
52+
def timeit(self, times):
53+
import time
54+
it = itertools.repeat(None, times)
55+
gc_on = gc.isenabled()
56+
gc.disable()
57+
try:
58+
duration = self.runner(it, time)
59+
finally:
60+
if gc_on:
61+
gc.enable()
62+
return duration
63+
64+
def repeat(self, cycles, times):
65+
t = []
66+
for i in xrange(cycles):
67+
tt = self.timeit(times)
68+
t.append(tt)
69+
return t
70+
71+
def timeit(target, setup, times):
72+
timer = Timer(target, setup)
73+
return timer.timeit(times)
74+
75+
def repeat(target, setup, times, cycles):
76+
timer = Timer(target, setup)
77+
return timer.repeat(cycles, times)
78+
79+
80+
def main():
81+
stmt1 = "a = 2+4"
82+
stmt2 = "test(1)"
83+
setup2 = "test = lambda x:x*2"
84+
def test_func():
85+
global x
86+
x = x*2
87+
88+
timer = Timer(stmt1)
89+
print stmt1, timer.timeit(100000)
90+
91+
timer = Timer(stmt2, setup2)
92+
print stmt2, timer.timeit(10000)
93+
94+
timer = Timer(test_func, "global x;x=1")
95+
print "func1", timer.timeit(10000)
96+
97+
print "func2", timeit("i,j=m, n", "m=1;n=2", 10000)
98+
99+
if __name__=="__main__":
100+
main()
101+
102+
103+
104+

web_terminal/index.html

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<script src='http://cdn.staticfile.org/jquery-jcrop/0.9.12/js/jquery.min.js'></script>
5+
<style>
6+
body {
7+
position: absolute;
8+
padding: 0;
9+
margin: 0;
10+
height: 100%;
11+
width: 100%;
12+
overflow: hidden;
13+
}
14+
#terminal {
15+
background-color: #000
16+
text: #fff;
17+
position: relative;
18+
width: 100%;
19+
height: 100%;
20+
}
21+
</style>
22+
<title>Python web terminal</title>
23+
</head>
24+
25+
<body>
26+
<div id='terminal'>
27+
<p>Welcome to python terminal, please enter your command:</p>
28+
<input id='input' type='text'></input>
29+
<button id='run'>run!</button>
30+
</div>
31+
<script type='text/javascript'>
32+
$(function(){
33+
$("#run").click(function(){
34+
var cmdline = $("#input").val()
35+
if(cmdline.length==0){
36+
alert("Input your command first!")
37+
return
38+
}
39+
var url = "/cmd"
40+
var payload = JSON.stringify({cmd:cmdline})
41+
$.post(url, payload, function(data){
42+
ret = data;
43+
var result = ret.result
44+
var input = $("#input").detach()
45+
var run = $("#run").detach()
46+
$("#terminal").append("<p>>>> "+result+"</p>")
47+
$("#terminal").append(input)
48+
$("#terminal").append(run)
49+
})
50+
})
51+
})
52+
</script>
53+
</body>
54+
</html>

web_terminal/web_terminal.py

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import BaseHTTPServer
2+
import json
3+
import subprocess
4+
5+
page404 = """
6+
<html>
7+
<head>
8+
<title>PAGE NOT FOUND</title>
9+
</head>
10+
<body>
11+
<h1>404 - Page not found</h1>
12+
</body>
13+
</html>
14+
"""
15+
16+
class TerminalHandler(BaseHTTPServer.BaseHTTPRequestHandler):
17+
def do_GET(self):
18+
if self.path=="/":
19+
with open("index.html", 'r') as f:
20+
pagestr = f.read()
21+
self.send_response(200)
22+
self.send_header("Content-type", "text/html; charset=utf-8")
23+
self.send_header("Content-length", str(len(pagestr)))
24+
self.end_headers()
25+
self.wfile.write(pagestr)
26+
else:
27+
self.send_error(404, "File not found")
28+
# self.wfile.write(page404)
29+
30+
def do_POST(self):
31+
if self.path=="/cmd":
32+
body = self.rfile.read(int(self.headers['Content-Length']))
33+
print body
34+
try:
35+
request = json.loads(body)
36+
except:
37+
self.send_error(500, "command format error")
38+
else:
39+
cmdline = request.get("cmd", None)
40+
runner = CommandRunner(cmdline)
41+
output = runner.get_output()
42+
ret = json.dumps({"result":str(output)})
43+
self.send_response(200)
44+
self.send_header("Content-type", "application/json; charset=utf-8")
45+
self.end_headers()
46+
self.wfile.write(ret)
47+
else:
48+
self.send_error(404, "File not found")
49+
50+
class CommandRunner(object):
51+
def __init__(self, cmd):
52+
self._cmds = cmd.split()
53+
54+
def get_output(self):
55+
print "COMMANDS:", self._cmds
56+
return subprocess.check_output(self._cmds, shell=True)
57+
58+
server = BaseHTTPServer.HTTPServer(("127.0.0.1", 8000), TerminalHandler)
59+
server.serve_forever()

0 commit comments

Comments
 (0)