python使用timeit测试/统计小段代码运行时间

 python  python使用timeit测试/统计小段代码运行时间已关闭评论
12月 232020
 

python下有个小而美的测试代码片段时间的模块timeit,使用方法如下:

比如:  “-“.join(str(n) for n in range(100))语句执行3趟,每趟10000次的时间统计如下测试:

一、 终端命令行方式:
python -m timeit -n 10000 -r 3 -v ‘”-“.join(str(n) for n in range(100))’
raw times: 0.345 0.351 0.329
10000 loops, best of 3: 32.9 usec per loop
每次执行了10000次,共执行3次,最好的1次,平均每loop是32.9 usec(32.9微秒,10000 loops,best of 3的意思是一共repeat了3次,每一次10000 loops,取最好的那一次来平均)。32.9 usec就是这一行python表达式的执行时间。

二、python模块内方式:
>>> import timeit
>>> timeit.timeit(‘”-“.join(str(n) for n in range(100))’, number = 10000)
0.3615691661834717
>>> timeit.repeat(‘”-“.join(str(n) for n in range(100))’, number = 10000, repeat=3)[0.37982702255249023, 0.3650989532470703, 0.3783681392669678]

三、jupyter note使用方式
%timeit -n 1000 -r 3 “-“.join(str(n) for n in range(100))

 

附录资料:

1. 命令行界面

命令格式: python -m timeit [-n N] [-r N] [-u U] [-s S] [-t] [-c] [-h] [语句 ...]

参数:

-n:执行次数
-r:计时器重复次数
-s:执行环境配置(通常该语句只被执行一次)
-v:打印原始时间
-h:帮助

 

2. 多行语句执行方式(注意空格)

python -m timeit ‘try:’ ‘  str.__bool__’ ‘except AttributeError:’ ‘  pass’

1000000 loops, best of 3: 1.2 usec per loop

mac新系统下使用pip安装模块时提示”Could not install packages due to an EnvironmentError” 问题解决

 python  mac新系统下使用pip安装模块时提示”Could not install packages due to an EnvironmentError” 问题解决已关闭评论
12月 112020
 

mac使用pip安装 pytorch时提示:” Could not install packages due to an EnvironmentError”

其实现在mac新系统不再允许直接操作根目录下文件,所以pip安装模块时经常提示这个,可以在pip安装时添加  –user  参数

比如:

pip install –user torch torchvision torchaudio

 

加 –user 的作用是显式指定安装在用户自己的工作空间而非全局的里。

DONE!

Mac 安装Jupyter Notebook并支持python 自动补全(自定义端口,密码访问)

 python  Mac 安装Jupyter Notebook并支持python 自动补全(自定义端口,密码访问)已关闭评论
12月 082020
 

一、安装运行:

  • pip3 install jupyter
  • jupyter notebook —generateconfig   (生成配置文件)
    • $ jupyter notebook –generate-config
    • Writing default config to: /Users/xxxxxx/.jupyter/jupyter_notebook_config.py
  • 生成jupyter 密码:
      • 方法一(one): 直接jupyter notebook password , 两次确认后直接写入配置文件(

        /Users/xxxxxx/.jupyter/jupyter_notebook_config.json

        ),完成。

      • 方法二(another):python命令行下执行
      • # 此时需要输入两次密码(一次设置,一次确认),然后生成sha1的密文,需拷贝下来填写到jupyter_notebook_config.py文件里
      • >>> from notebook.auth import passwd

        >>> passwd()

        Enter password:

        Verify password:

        ‘argon2:$argon2id$v=19$m=10240,t=10,p=8$LrRgSOg35ZZepMQiv+pSbQ$2SXyFdqy9vaWseqF7kWZHQ’

         

  • 修改配置文件jupyter_notebook_config.py
    • 在这个配置文件里关注两个:
    • c.NotebookApp.port = 8888  (服务端口,默认8888)

    • c.NotebookApp.password = ‘argon2:$argon2id$v=19$m=10240,t=10,p=8$LrRgSOg35ZZepMQiv+pSbQ$2SXyFdqy9vaWseqF7kWZHQ’    (密码,填入上面产生的密码。如果使用上面方法一产生密码此处都不用修改)

  • 启动jupyter(此处还可以在这里通过参数指定运行的端口,比如8080)
  • nohup jupyter notebook –no-browser —allow-root –ip=0.0.0.0 –port=8080  &

 

二、扩展,自动补全

  • pip3 install jupyter_contrib_nbextensions
  • jupyter contrib nbextension install –user –skip-running-check
  • pip3 install jupyter_nbextensions_configurator
  • 然后重新启动Jupyter Notebook后,就会发现已经有Nbextensions标签了。

常用扩展功能,勾选上即可:

DONE!!!

sublimeREPL下python 2 切换为 python 3

 python, sublime  sublimeREPL下python 2 切换为 python 3已关闭评论
7月 202020
 

转自:https://www.jianshu.com/p/41df9da08f60

1、安装python3

 

$ brew search python
$ brew install python3

这里安装完后不需要单独添加环境变量,程序已经处理好,可以直接运行python3命令。

$ which python
/usr/bin/python

$ which python3
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3

$ echo $PATH
/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

2、安装REPL插件,并设置快捷键绑定。

打开后,搜索 SublimeREPL 安装即可。

设置快捷键:

Preferences -> Key Bindings

[   
    {"keys":["f1"],
    "caption": "SublimeREPL: Python - RUN current file",
    "command": "run_existing_window_command", "args":
    {"id": "repl_python_run",
    "file": "config/Python/Main.sublime-menu"}},

    {"keys":["f2"],
    "caption": "SublimeREPL: Python",
    "command": "run_existing_window_command", "args":
    {"id": "repl_python",
    "file": "config/Python/Main.sublime-menu"}}
]

这里我设置的 F1 运行代码,F2 打开终端。

3、按 F2 运行终端,发现默认集成的是 python2,手动改成 pyhton3,方法如下:

$ sudo find / -iname 'Main.sublime-menu'
$ vim /Users/keithtt/Library/Application\ Support/Sublime\ Text\ 3/Packages/SublimeREPL/config/Python/Main.sublime-menu

"cmd": ["python3", "-i", "-u"],
"cmd": ["python3", "-i", "-u", "-m", "pdb", "$file_basename"],
"cmd": ["python3", "-u", "$file_basename"],
"cmd": {
    "osx": ["python3", "-u", "${packages}/SublimeREPL/config/Python/ipy_repl.py"],
    "linux": ["python3", "-u", "${packages}/SublimeREPL/config/Python/ipy_repl.py"],
    "windows": ["python3", "-u", "${packages}/SublimeREPL/config/Python/ipy_repl.py"]
},

将该文件中调用 python 命令的地方全部改成 python3 即可。

改完之后再次按 F2 运行终端,效果如下:

python 2中希望使用print时将\uxxxx的文字打印为中文

 python  python 2中希望使用print时将\uxxxx的文字打印为中文已关闭评论
5月 092020
 

在python 2里使用print打印含有\uxxx的中文字符时不能直接显示中文,可以使用下面的方式:

举例:

obj = [u’\u53c8\u6765\u5077\u5077\u770b\u6211′,u’\u7231\u6211\u4f60\u5c31\u544a\u8bc9\u6211′]

使用: print(repr(obj).decode(‘unicode-escape’))

 

obj=[‘又来偷偷看我’,’爱我你就告诉我’]

使用:print(repr(obj).decode(‘string-escape’))

 

python 3 没有这个问题

supervisord管理python进程时print(stdout)日志输出不及时,甚至有缺失问题解决

 python, supervisord  supervisord管理python进程时print(stdout)日志输出不及时,甚至有缺失问题解决已关闭评论
12月 192019
 

使用supervisord管理python进程,代码中print()打印的日志在使用tail -f查看时输出总是不及时,甚至有缺失问题,网络上有下面的几种方式解决:

If you are also using Supervisor to monitor and heal your long running Python projects and observed that output of your program is not being logged to stdout_logfile, it is because Python print statement does not automatically flush output to STDOUT.

One solution is using sys.stdout.flush() frequently to flush the output or if you are using Python 3.3, print(msg, flush=True) is another solution. However, a better solution is to run python with -u parameter (unbuffered mode).

以上总结方法:

  1. 频繁使用sys.stdout.flush()
  2. python3.3以后版本,print使用print(msg, flush=True)
  3. supervisord配置文件里command命令行添加-u参数(这个是最推荐的方法)

举例:

[program:analysis]
command = python -u AnalysisTest.py -port=70%(process_num)02d

python输出有颜色和背景色的文字(\033[显示方式;前景色;背景色m, \033[0m )

 python  python输出有颜色和背景色的文字(\033[显示方式;前景色;背景色m, \033[0m )已关闭评论
11月 212019
 

python中经常有输出文字的需求,特别是如果输出的文字带颜色或者文字有背景色的化更能突出重点,在运维时特别有用,那如何使输出文字带颜色和背景色呢?

#格式:
设置颜色开始 :\033[显示方式;前景色;背景色m

例如:
\033[31;43;1m #—红底黄字高亮显示
\033[0m     #—采用终端默认设置,即缺省颜色,一般可以在文字显示后,添加在末尾以恢复默认

#说明:
前景色:
30 黑色
31  红色
32 绿色
33 黃色
34 蓝色
35 紫红色
36 青蓝色
37 白色

背景色:
40 黑色
41 红色
42 绿色
43 黃色
44 蓝色
45 紫红色
46 青蓝色
47 白色

显示方式:

0 终端默认设置
1 高亮显示
4 使用下划线
5 闪烁
7 反白显示

 

大家可以发现: ‘;’前后的三个参数:显示方式,前景色,背景色是可选参数,可以只写其中的某一个或者某两个;由于表示三个参数不同含义的数值都是唯一没有重复的,所以三个参数的书写先后顺序没有固定要求,系统都可识别,所以参数的前后顺序实际是没有关系,但还是建议大家按规则来。

 

以下举个例子,看下效果(大家特别体会下结尾有和没有“\033[0m”的效果):

#!/usr/bin/python
#coding=utf-8

print("\033[1;33m 我是1;33m的显示效果   \033[3;31m")
print('我是是上一行结尾的3;31m颜色输出效果 ')
print("\n")

print("==========前景色==========")
print("\033[30;1mHello, Welcome To Python! " + "#黑字")   #黑
print("\033[31;1mHello, Welcome To Python! " + "#红字")   #红
print("\033[32;1mHello, Welcome To Python! " + "#绿字")   #绿
print("\033[33;1mHello, Welcome To Python! " + "#黄字")   #黄
print("\033[34;1mHello, Welcome To Python! \033[0m" + "#蓝字")   #蓝
print("\033[35;1mHello, Welcome To Python! \033[0m" + "#紫字")   #紫
print("\033[36;1mHello, Welcome To Python! \033[0m" + "#青字") #青
print("\033[37;1mHello, Welcome To Python! \033[0m" + "#白字") #白
print("==========背景色==========")
print("\033[40;1mHello, Welcome To Python! \033[0m" + "#黑底")   #黑
print("\033[41;1mHello, Welcome To Python! " + "#红底")   #红
print("\033[42;1mHello, Welcome To Python! " + "#绿底")   #绿
print("\033[43;1mHello, Welcome To Python! \033[0m" + "#黄底")   #黄
print("\033[44;1mHello, Welcome To Python! \033[0m" +"#蓝底")   #蓝
print("\033[45;1mHello, Welcome To Python! \033[0m" + "#紫底")   #紫
print("\033[46;1mHello, Welcome To Python! \033[0m" + "#青底")   #青
print("\033[47;1mHello, Welcome To Python! \033[0m" + "#白底")   #白
print("=======结合前景色背景色==========")
print("\033[31;43;1mHello, Welcome To Python! \033[0m" + "#红字黄底")   #红字黄底
print("\033[43;31;1mHello, Welcome To Python! \033[0m" + "#红字黄底(有意调换)")   #红字黄底
print("\033[35;42;1mHello, Welcome To Python! \033[0m" + "#紫字绿底")   #紫字绿底
print("=======结合前景色背景色显示方式==========")
print("\033[30;47;1mHello, Welcome To Python! \033[0m" + "#高亮显示")   #高亮显示
print("\033[30;47;4mHello, Welcome To Python! \033[0m" + "#使用下划线")   #使用下划线


输出效果如下:

pip安装包到指定目录方法(指定路径)

 mac, pip, python  pip安装包到指定目录方法(指定路径)已关闭评论
10月 242019
 

mac中使用pip安装包后,可能会发现明明提示“Successfully installed xxx“,但就是找不到这个包“ImportError: No module named  xxx”?

其实是这样: 默认pip安装在/usr/local/lib/python2.7/site-packages, 但如果sudo pip安装则会安装在/lib/python2.7/site-packages,那如果我要指定安装包的路径需要怎么做呢?使用下面的黑体字命令即可,在-install-option里添加–install-purelib指定目录即可,以下命令安装google-api-python-client包到/usr/local/lib/python2.7/site-packages

pip install --install-option="--install-purelib=/usr/local/lib/python2.7/site-packages" google-api-python-client

 

DONE!!!

mac下使用pip安装模块时,出现错误提示:     “must supply either home or prefix/exec-prefix — not both”

 mac, python  mac下使用pip安装模块时,出现错误提示:     “must supply either home or prefix/exec-prefix — not both”已关闭评论
10月 232019
 

mac下使用pip安装时,出现错误提示:

    “must supply either home or prefix/exec-prefix — not both”

DistutilsOptionError: must supply either home or prefix/exec-prefix — not both

 

参考Homebrew python页 https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md

在文件~/.pydistutils.cfg中加入如下内容:

[install]

prefix=

 

再pip安装即可!

centos 7 使用pyenv 安装 python 3 出现“ModuleNotFoundError: No module named ‘_ctypes’”的问题解决

 python  centos 7 使用pyenv 安装 python 3 出现“ModuleNotFoundError: No module named ‘_ctypes’”的问题解决已关闭评论
10月 232019
 

centos 7 下使用pyenv 安装python 3.7时错误如下;

Downloading Python-3.7.4.tar.xz…
-> https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tar.xz
Installing Python-3.7.4…

BUILD FAILED (CentOS Linux 7 using python-build 20180424)

Inspect or clean up the working tree at /tmp/python-build.20191023165632.13343
Results logged to /tmp/python-build.20191023165632.13343.log

Last 10 log lines:
File “/tmp/tmpgvoc4sao/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/main_parser.py”, line 12, in <module>
File “/tmp/tmpgvoc4sao/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/commands/__init__.py”, line 6, in <module>
File “/tmp/tmpgvoc4sao/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/commands/completion.py”, line 6, in <module>
File “/tmp/tmpgvoc4sao/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/base_command.py”, line 20, in <module>
File “/tmp/tmpgvoc4sao/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/download.py”, line 37, in <module>
File “/tmp/tmpgvoc4sao/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/utils/glibc.py”, line 3, in <module>
File “/tmp/python-build.20191023165632.13343/Python-3.7.4/Lib/ctypes/__init__.py”, line 7, in <module>
from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named ‘_ctypes’
make: *** [install] Error 1

 

解决方法如下:

  1. 先安装: yum install libffi-devel -y
  2. 再安装python: pyenv install 3.7.4

DONE!

如果安装成功后有WARNING提示:

WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib?
WARNING: The Python readline extension was not compiled. Missing the GNU readline lib?
WARNING: The Python sqlite3 extension was not compiled. Missing the SQLite3 lib?

为避免后续使用中问题,可进一步安装其它依赖包

yum install readline readline-devel readline-static -y

yum install sqlite-devel -y

yum install bzip2-devel bzip2-libs -y

yum install openssl openssl-devel openssl-static -y

OK!!

ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)解决

 python  ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)解决已关闭评论
10月 082019
 

mac下使用import pycurl,出现: ImportError: pycurl: libcurl link-time ssl backend (openssl) is different from compile-time ssl backend (none/other)

 

使用下面方式解决:

pip uninstall pycurl
pip install --compile --install-option="--with-openssl" pycurl


Python中filter、map、reduce、lambda 介绍

 python  Python中filter、map、reduce、lambda 介绍已关闭评论
9月 242019
 

Python中filter, map, reduce, lambda函数介绍

filter(function, sequence):对sequence中的item依次执行function(item),将执行结果为True的item组成一个List/String/Tuple(取决于sequence的类型)返回:
>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def f(x): return x != ‘a’
>>> filter(f, “abcdef”)
‘bcdef’

map(function, sequence) :对sequence中的item依次执行function(item),见执行结果组成一个List返回:
>>> def cube(x): return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def cube(x) : return x + x

>>> map(cube , “abcde”)
[‘aa’, ‘bb’, ‘cc’, ‘dd’, ‘ee’]
另外map也支持多个sequence,这就要求function也支持相应数量的参数输入:
>>> def add(x, y): return x+y
>>> map(add, range(8), range(8))
[0, 2, 4, 6, 8, 10, 12, 14]

reduce(function, sequence, starting_value):对sequence中的item顺序迭代调用function,如果有starting_value,还可以作为初始值调用,例如可以用来对List求和:
>>> def add(x,y): return x + y
>>> reduce(add, range(1, 11))
55 (注:1+2+3+4+5+6+7+8+9+10)
>>> reduce(add, range(1, 11), 20)
75 (注:1+2+3+4+5+6+7+8+9+10+20)

lambda:这是Python支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方:
>>> g = lambda x: x * 2
>>> g(3)
6
>>> (lambda x: x * 2)(3)
6

我们也可以把filter map reduce 和lambda结合起来用,函数就可以简单的写成一行。
例如
kmpathes = filter(lambda kmpath: kmpath,
map(lambda kmpath: string.strip(kmpath),

string.split(l, ‘:’)))
看起来麻烦,其实就像用语言来描述问题一样,非常优雅。
对 l 中的所有元素以’:’做分割,得出一个列表。对这个列表的每一个元素做字符串strip,形成一个列表。对这个列表的每一个元素做直接返回操作(这个地方可以加上过滤条件限制),最终获得一个字符串被’:’分割的列表,列表中的每一个字符串都做了strip,并可以对特殊字符串过滤

 Posted by at 上午8:09

pip/pip3切换到国内安装源

 python  pip/pip3切换到国内安装源已关闭评论
9月 162019
 

pip/pip3默认安装源国内下载速度实在太慢了,经常出现timeout,可以使用下面的方式切换到ali源,速度还是很给力的!

linux/mac下运行命令
vi ~/.pip/pip.conf

windows:
%HOMEPATH%\pip\pip.ini

然后写入如下内容并保存:
[global]
trusted-host = mirrors.aliyun.com
index-url = https://mirrors.aliyun.com/pypi/simple

Python模板-Mako语法介绍

 python  Python模板-Mako语法介绍已关闭评论
9月 052019
 

资源

官网 http://www.makotemplates.org/

文档 http://docs.makotemplates.org/en/latest/

文档翻译 Mako模板入门 http://help.42qu.com/code/mako.html

安装

pip install mako

HelloWorld

from mako.template import Template

mytemplate = Template("hello world!")
print mytemplate.render()

-------------------------

from mako.template import Template
print Template("hello ${data}!").render(data="world")

语法

输出变量 ${x}

数学计算 ${1+1}
the contents within the ${} tag are evaluated by Python directly, so full expressions are OK

filter
${"test"|u}
${"test"|u,trim}
内置filter列表
    u : URL escaping, provided by urllib.quote_plus(string.encode('utf-8'))
    h : HTML escaping, provided by markupsafe.escape(string)
    x : XML escaping
    trim : whitespace trimming, provided by string.strip()
    entity : produces HTML entity references for applicable strings, derived from htmlentitydefs
    unicode (str on Python 3): produces a Python unicode string (this function is applied by default)
    decode.<some encoding> : decode input into a Python unicode with the specified encoding
    n : disable all default filtering; only filters specified in the local expression tag will be applied.

分支
% if x == 5:
    abcd
% endif

循环
% for a in ['1', '2', '3']:
    % if a == '1':
      abc
    % elif a == '2':
      def
    % else:
      gh
    % endif
$ endfor

Python语法
this is a template
<%
    x = db.get_resource('foo')
    y = [z.element for z in x if x.frobnizzle==5]
%>
% for elem in y:
    element: ${elem}
% endfor

换行

加 / 强制不换行


设置变量
% for item in ('apple', 'banana'):
    <%
        isBanana = False
    %>
    % if item == 'banana':
    <%
        isBanana = True
    %>
    %endif
    % if isBanana:
        <span> Bought a banana</span>
    %endif
%endfor

注释

## 这是一个注释.
...text ...

多行
<%doc>
这里是注释
更多注释
</%doc>

模块级别语句

<% %> 的一个变体是 <%! %>,代表模块级别的代码块。其中的代码会在模板的模块级别执行,而不是在模板的 rendering 函数中。

<%!
import mylib
import re

def filter(text):
    return re.sub(r'^@', '', text)
%>

标签

定义了当前模板的总体特性,包括缓存参数,以及模板被调用时期待的参数列表(非必须)
<%page args="x, y, z='default'"/>
<%page cached="True" cache_type="memory"/>


<%include file="header.html"/>
hello world
<%include file="footer.html"/>

%def 标签用于定义包含一系列内容的一个 Python 函数,此函数在当前模板的其他某个地方被调用到
<%def name="myfunc(x)">
this is myfunc, x is ${x}
</%def>
${myfunc(7)}

<%block filter="h">
some <html> stuff.
</%block>
<%block name="header">
    <h2><%block name="title"/></h2>
</%block>

Mako 中的 %namespace 等价于 Python 里的 import 语句。它允许访问其他模板文件的所有 rendering 函数和元数据
<%namespace file="functions.html" import="*"/>

<%inherit file="base.html"/>

处理多行注释:
<%doc>
    these are comments
    more comments
</%doc>

该标签使得 Mako 的词法器对模板指令的常规解析动作停止,并以纯文本的形式返回其整个内容部分
<%text filter="h">
heres some fake mako ${syntax}
<%def name="x()">${x}</%def>
</%text>

有时你想中途停止执行一个模板或者 <%def> 方法,只返回已经收集到的文本信息,可以通过在 Python 代码块中使用 return 语句来完成

% if not len(records):
    No records found.
    <% return %>
% endif

文件template

为提高性能,从文件中加载的 Template, 可以将它产生的模块的源代码以普通 python 模块文件的形式(.py),

缓存到文件系统中。只要加一个参数 module_directory 即可做到这一点:

from mako.template import Template

mytemplate = Template(filename='/docs/mytmpl.txt', module_directory='/tmp/mako_modules')
print mytemplate.render()

当上述代码被 render 的时候,会创建文件 /tmp/mako_modules/docs/mytmpl.txt.py.

下一次 Template 对象被用同样参数调用的时候,就会直接重用该模块文件。

文件TemplateLookup

#有一个对 header.txt 文件的包含引用。而从何处去查找 header.txt, 则由 TemplateLookup 指明,是 "/docs" 目录
from mako.template import Template
from mako.lookup import TemplateLookup

mylookup = TemplateLookup(directories=['/docs'])
mytemplate = Template("""<%include file="header.txt"/> hello world!""", lookup=mylookup)


--------------

#可以直接通过 TemplateLookup 来获取模板对象,利用 TemplateLookup 的 get_template 方法,
#并传递模板的 URI 作为参数
mylookup = TemplateLookup(directories=['/docs'], output_encoding='utf-8', encoding_errors='replace')
mytemplate = mylookup.get_template("foo.txt")
print mytemplate.render()

-------------
参数
mylookup = TemplateLookup(directories=['/docs'], output_encoding='utf-8', encoding_errors='replace', , collection_size=500)
TemplateLookup 同时也会在内存中缓存一组模板,所以并不是每一次请求都会导致模板的重新编译和模块重新加载。默认 TemplateLookup 的大小没有限制,但你可以通过 collection_size 参数来限制它
以上的 lookup 会持续加载模板到内存中,直到达到 500 的时候,它就会清除掉一定比例的模板缓存项,根据“最近最少访问”原则

另一个 TemplateLookup 相关的标志是  filesystem_checks. 默认为 True,
每一次 get_template() 方法返回模板后,原始的模板文件的 revision time 会和上次加载模板的时间做对比,
如果文件更新,则会加载其内容,并重新编译该模板。
在生产环境下,设置 filesystem_checks 为 False 可以带来一定的性能提升(和具体的文件系统有关)

自己创建context

from mako.template import Template
from mako.runtime import Context
from StringIO import StringIO

mytemplate = Template("hello, ${name}!")
buf = StringIO()
ctx = Context(buf, name="jack")
mytemplate.render_context(ctx)
print buf.getvalue()

其他

1.解决mako中文乱码问题

TemplateLookup(... , output_encoding='utf-8', ...)
Template(..., input_encoding='utf-8')
又在mako的模板文件的首行添加
## -*- encoding:utf8 -*-