Python不是java

Python不是java 同样,php也不是java, 用一种语言的思路来写另一种语言的代码,最后肯定是四不像。 有感。 原文: I was recently looking at the source of a wxPython-based GUI application, about 45.5KLOC in size, not counting the libraries used (e.g. Twisted). The code was written by Java developers who are relatively new to Python, and it suffers from some performance issues (like a 30-second startup time). In examining the code, I found that they had done lots of things that make sense in Java, but which suck terribly in Python. Not because “Python is slower than Java”, but because there are easier ways to accomplish the same goals in Python, that wouldn’t even be possible in Java. So, the sad thing is that these poor folks worked much, much harder than they needed to, in order to produce much more code than they needed to write, that then performs much more slowly than the equivalent idiomatic Python would. Some examples: * A static method in Java does not translate to a Python classmethod. Oh sure, it results in more or less the same effect, but the goal of a classmethod is actually to do something that’s usually not even possible in Java (like inheriting a non-default constructor). The idiomatic translation of a Java static method is usually a module-level function, not a classmethod or staticmethod. (And static final fields should translate to module-level constants.) This isn’t much of a performance issue, but a Python programmer who has to work with Java-idiom code like this will be rather irritated by typing Foo.Foo.someMethod when it should just be Foo.someFunction. But do note that calling a classmethod involves an additional memory allocation that calling a staticmethod or function does not. Oh, and all those Foo.Bar.Baz attribute chains don’t come for free, either. In Java, those dotted names are looked up by the compiler, so at runtime it really doesn’t matter how many of them you have. In Python, the lookups occur at runtime, so each dot counts. (Remember that in Python, “Flat is better than nested”, although it’s more related to “Readability counts” and “Simple is better than complex,” than to being about performance.) * Got a switch statement? The Python translation is a hash table, not a bunch of if-then statments. Got a bunch of if-then’s that wouldn’t be a switch statement in Java because strings are involved? It’s still a hash table. The CPython dictionary implementation uses one of the most highly-tuned hashtable implementations in the known universe. No code that you write yourself is going to work better, unless you’re the genetically-enhanced love child of Guido, Tim Peters, and Raymond Hettinger. ...

January 2, 2010 · notsobad

How about xml?

Some people, when confronted with a problem, think “I know, I’ll use XML.” Now they have two problems.

January 2, 2010 · notsobad

django备忘

备忘: save() got an unexpected keyword argument ‘force_insert’ 解决: save时需要带上 *args, **kwargs def save(self, *args, **kwargs): #... super(SiteUser, self).save(*args, **kwargs) [参考](http://groups.google.com/group/django- users/browse_thread/thread/2471efd68d56ad59/a8c000a383db3f63?lnk=raot) 另: relation “django_admin_log” does not exist 这是因为启用了admin,但是没有syncdb 运行: ./manage.py syncdb

December 31, 2009 · notsobad

vi的自动折行

vi的自动折行太贱了,写代码还好,我一个字符串很长,它也给我截断,字符串一截就给加了换行和tab 我忘了在哪里里配置的了,没办法,临时取消折行: set textwidth=99999

December 30, 2009 · notsobad

备忘

备忘: django admin界面报模板错误, 说是下面这一行有问题: {% url django-admindocs-docroot as docsroot %}. 排查发现是url.py里配置有问题导致的,错误信息很不明显。 (The error is showing up where it is because the admin uses {% url django- admindocs-docroot as docsroot %} to conditionally include a Documentation link on each admin page, based on whether the admindocs urls have been configured. This template tag will result in all of your url patterns being evaluated, and problems with any will be reported. You need to find the app you are running that has a registration/views.py file that imports oldforms and upgrade it to use current forms.) ...

December 30, 2009 · notsobad

javascript字符转为数字

以前一直用的parseInt,今天终于遇到了问题了,查了半天发现是parseInt的问题 我处理坐标top,left,这些是float型的数据,parseInt转为整数了,细微的差别导致问题了。 所以如果要把字符型转为数字,首选的应该是parseFloat,取整的话才用parseInt。 ...

December 29, 2009 · notsobad

linux的ls命令

ls谁都会用,但是你真的很熟吗? ls -r -d -1 proxy_* 2>/dev/null | sed -n '1s/^proxy_//p' 544 /media/sda6/collection/music>ls --help 用法:ls [选项]... [文件]... 列出<文件>的信息 (默认为目前的目录)。 如果不指定 -cftuvSUX 或 --sort 任何一个选项,则根据字母大小排序。 长选项必须用的参数在使用短选项时也是必需的。 -a, --all 不隐藏任何以 . 字符开始的项目 -A, --almost-all 列出除了 . 及 .. 以外的任何项目 --author 和 -l 同时使用时列出每个文件的作者 -b, --escape 以八进制溢出序列表示不可打印的字符 --block-size=大小 块以指定<大小>的字节为单位 -B, --ignore-backups 不列出任何以 ~ 字符结束的项目 -c 配合 -lt:根据 ctime 排序及显示 ctime (文件 状态最后更改的时间) 配合 -l:显示 ctime 但根据名称排序 否则:根据 ctime 排序 -C 每栏由上至下列出项目 --color[=WHEN] 控制是否使用色彩分辨文件。WHEN 可以是 "never"、"always"或"auto"其中之一 -d, --directory 当遇到目录时列出目录本身而非目录内的文件 -D, --dired 产生适合Emacs 的dired 模式使用的结果 -f 不进行排序,-aU 选项生效,-lst 选项失效 -F, --classify 加上文件类型的指示符号(*/=@| 其中一个) --format=关键字 交错-x,逗号分隔-m,水平-x,长-l, 单栏-1,详细-l,垂直-C --full-time 即-l --time-style=full-iso -g 类似 -l,但不列出属主 --group-directories-first 在文件前分组目录。此选项可与--sort 一起使用, 但是一旦使用--sort=none (-U)将禁用分组 -G, --no-group 以一个长列表的形式,不输出组名 -h, --human-readable 与-l 一起,以易于阅读的格式输出文件大小 (例如 1K 234M 2G) --si 同上面类似,但是使用1000 为基底而非1024 -H, --dereference-command-line 跟随命令行列出的符号链接 --dereference-command-line-symlink-to-dir 跟随命令行列出的目录的符号链接 --hide=PATTERN 隐藏符合PATTERN 模式的项目 (-a 或 -A 将覆盖此选项) --indicator-style=方式 指定在每个项目名称后加上指示符号方式: none (默认),classify (-F),file-type (-p) -i, --inode 显示每个文件的inode 号 -I, --ignore=PATTERN 不显示任何符合指定shell PATTERN 的项目 -k 即--block-size=1K -l 使用较长格式列出信息 -L, --dereference 当显示符号链接的文件信息时,显示符号链接所指示 的对象而并非符号链接本身的信息 -m 所有项目以逗号分隔,并填满整行行宽 -n, --numeric-uid-gid 类似 -l,但列出UID 及GID 号 -N, --literal 输出未经处理的项目名称 (如不特别处理控制字符) -o 类似 -l,但不列出有关组的信息 -p, --indicator-style=slash 对目录加上表示符号"/" -q, --hide-control-chars 以 ? 字符代替无法打印的字符 --show-control-chars 直接显示无法打印的字符 (这是默认方式,除非调用 的程序名称是“ls”而且是在终端机画面输出结果) -Q, --quote-name 将项目名称括上双引号 --quoting-style=方式 使用指定的 quoting <方式>显示项目的名称: literal、locale、shell、shell-always、c、escape -r, --reverse 排序时保留顺序 -R, --recursive 递归显示子目录 -s, --size 以块数形式显示每个文件分配的尺寸 -S 根据文件大小排序 --sort=WORD 以下是可选用的WORD 和它们代表的相应选项: extension -X status -c none -U time -t size -S atime -u time -t access -u version -v use -u --time=WORD 和-l 同时使用时显示WORD 所代表的时间而非修改时 间:atime、access、use、ctime 或status;加上 --sort=time 选项时会以指定时间作为排序关键字 --time-style=STYLE 和-l 同时使用时根据STYLE 代表的格式显示时间: full-iso、iso、locale、posix-iso、+FORMAT。 FORMAT 即是"date"所用的时间格式;如果FORMAT 是FORMAT1<换行>FORMAT2,FORMAT1 适用于较旧 的文件而FORMAT2 适用于较新的文件;如果STYLE 以"posix-"开头,则STYLE 仅在POSIX 语系之外 生效。 -t 根据修改时间排序 -T, --tabsize=宽度 指定制表符(Tab)的宽度,而非8 个字符 -t 按修改时间排序 -T, --tabsize=COLS 指定制表符(Tab)的宽度,而非8个字符 -u 同-lt 一起使用:按照访问时间排序并显示 同-l一起使用:显示访问时间并按文件名排序 其他:按照访问时间排序 -U 不进行排序;按照目录顺序列出项目 -v 在文本中进行数字(版本)的自然排序 -w, --width=COLS 自行指定萤幕宽度而不使用目前的数值 -x 逐行列出项目而不是逐栏列出 -X 根据扩展名排序 -1 每行只列出一个文件 --help 显示此帮助信息并退出 --version 输出版本信息并退出 [大小]可以是以下的单位(单位前可加上整数): kB 1000,K 1024,MB 1000000,M 1048576,还有 G、T、P、E、Z、Y。 默认情况下不使用色彩来区别文件,此方式等于使用了 --color=none 选项。若使用 --color 选项但不指定 WHEN 参数则等于--color=always。当使用 --color=auto 时, 只当输出至终端(tty)时才会显示色彩。 退出状态: 0 正常 1 一般问题 (例如:无法访问子文件夹) 2 严重问题 (例如:无法使用命令行参数)

December 28, 2009 · notsobad

登录shell和非登录shell

所谓的登录shell和非登录shell的区别: 发信人: edyfox (滇狐), 信区: LinuxApp 标 题: Re: 为什么我的gnome- terminal启动的时候.bash_profile没有被执 发信站: 水木社区 (Wed Apr 18 18:22:06 2007), 站内 1. 登录方式执行 bash 时只运行 .bash_profile 2. 非登录方式执行 bash 时只运行 .bashrc 3. 按照大家的习惯,建议把配置写在 .bashrc 中, 而在 .bash_profile 中 source ~/.bashrc。 4. gnome- terminal 默认使用非登录方式执行 bash。 5. 要改为登录方式执行 bash 可以: 编辑 -> 当前配置文件 -> 标题和颜色 选中“以登录 Shell 方式执行命令” 【 在 beninu (葛之覃兮) 的大作中提到: 】 : 说说吧 只要将本文转载或手动贴到本站其它版面,系统就会自动将你的文章数 +1。 我刚试验了,绝对是真的! ※ 来源:·水木社区 newsmth.net·[FROM: 166.111.68.*] ...

December 25, 2009 · notsobad

split and sort

网上看到的一道题,不知道愿意是不是让用shell来做。 老实说,我也不知道这样写速度是否真的会快一点。没有这样的数据来测试。 # 有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。 # 请用5分钟时间,找出重复出现最多的前10条 set -x # 拆分为10000行一个的文件。 split msg_file -l 10000 for i in x*;do sort $i | tail -10 > ${i}_tmp & done sleep 5 # Wait for the sort cat x*_tmp | sort | tail -10 > out.txt rm x*_tmp rm x*

December 25, 2009 · notsobad

php中的unset

php中unset只是清除掉一个变量,并不意味着内存会被立即清理,会交给GC来处理。 如果把一个变量置为null,意味着覆写了变量,内存会被更快清理,但是会导致cpu运算,导致执行时间变长。 参考 unset() does just what it’s name says - unset a variable. It does not force immediate memory freeing. PHP’s garbage collector will do it when it see fits - by intention as soon, as those CPU cycles aren’t needed anyway, or as late as before the script would run out of memory, whatever occurs first. If you are doing $whatever = null; then you are rewriting variable’s data. You might get memory freed / shrunk faster, but it may steal CPU cycles from the code that truly needs them sooner, resulting in a longer overall execution time. ...

December 24, 2009 · notsobad