理解python中global的含义了……

01月 13, 2010

In [1]: a = [5, 6]
In [2]: def somefun():
…:     b = [6, 7]
…:     b += [4]
…:     print b
…:
…:
In [3]: somefun()
[6, 7, 4]
In [4]: def somefun():
a += [4]
print a
…:
In [7]: somefun()
—————————————————————————
UnboundLocalError                         Traceback (most recent call last)

/home/sky/<ipython console> in <module>()

/home/sky/<ipython console> in somefun()

UnboundLocalError: local variable ‘a’ referenced before assignment
In [8]: def somefun():
a.append(4)
print a
….:
In [11]: somefun()
[5, 6, 4]
In [12]:

python的复习(1)

01月 12, 2010
  1. 如果是python a.py,在里面__name__是”__main__”,如果是被import的,__name__是module名
  2. 为全局变量起一个本地的别名: import os; ls = os.linesep;…
  3. 对象的唯一标识:id()
  4. isinstance(num, int)
  5. 使用L表示长整型,不过不像C/C++,没有U
  6. 在不同类型之间进行运算的时候,需要用到类型转换,与coerce()函数有关
  7. oct()和hex(),返回整数的字符串表示
  8. chr() <–> ord(), plus unichr()
  9. basestring是unicode和str的父类
  10. enumerate/max/min/sorted/sum/zip,都可以接受一个可迭代对象做参数
  11. 较多使用字典类型的字符串模式化
  12. 浅copy是用切片来实现的
  13. dict.get(xx, yy), dict.pop(xx, yy), dict.setdefault(xx, yy)
  14. dict.sorted() 返回有序迭代子
  15. __hash__(),不可变==可哈希
  16. frozenset(),还有这个东东可以试试
  17. 使用迭代器
  18. 使用生成器表达式,看起来它返回一个可迭代的容器
  19. open(),’U'支持通用换行符。另外可以设置缓冲
  20. os.linesep, os.sep, os.pathsep, os.curdir, os.pardir
  21. file.encoding, file.name, file.mode
  22. 简单用getopt,复杂用optparse
  23. cStringIO
  24. 修饰器是实现函数模板的一种办法
  25. 只有需要修改的时候才使用global: global var1, var2, var3…
  26. 关于闭包、生成器,核心编程已经不够用了

monit配置

01月 12, 2010

一,使用init来带monit

cat >> /etc/inittab << END

# Run Monit in standard run-levels
mo:2345:respawn:/usr/sbin/monit -Ic /etc/monit/monitrc
END

telinit q 或者 kill -1 1

二、待续

使用git的体会

01月 10, 2010

git又好用又难用。好用是因为它理念很好,难用是因为有些复杂。

我在使用git的过程中有一些体会,发上来仅供参考。

  1. push之前先remote update再merge,否则可能push失败
  2. 在本地开新的分支,尽可能多地细分commit,然后使用rebase -i将这些commit合成几个大的commit
  3. 不要rebase origin/*,而要merge,否则会给别人带来麻烦,而且rebase之前要求clean,而merge不要求
  4. 将本地的新分支合并入master的时候可以用rebase,这样可以产生直线的历史
  5. windows下的msysgit很好用,有补全、提示
  6. git svn clone的时候加上-s会很方便
  7. 暂时没了

如何确定Linux下一个进程所占用的内存大小

01月 7, 2010

如何确定Linux下一个进程所占用的内存大小?这看起来超简单,top或者ps一下就能看出来。今天研究了一下发现并没有这么简单,相反还比较复杂。

以TOP为例,它有若干指示内存占用的列,从man top里摘抄如下:

n: %MEM  –  Memory usage (RES)
A task’s currently used share of available physical memory.

o: VIRT  –  Virtual Image (kb)

The total amount of virtual memory used by the task.  It includes all code, data and shared libraries plus pages that have been swapped out.

VIRT = SWAP + RES.

p: SWAP  –  Swapped size (kb)
The swapped out portion of a task’s total virtual memory image.

q: RES  –  Resident size (kb)
The non-swapped physical memory a task has used.

r: CODE  –  Code size (kb)
The amount of virtual memory devoted to executable code, also known as the ‘text resident set’ size or TRS.

s: DATA  –  Data+Stack size (kb)
The amount of virtual memory devoted to other than executable code, also known as the ‘data resident set’ size or DRS.

t: SHR  –  Shared Mem size (kb)
The amount of shared memory used by a task.  It simply reflects memory that could be potentially shared with other processes.

首先是MEM大有深意。”share of available physical memory”,意为可用物理内存的共享。这说明代表的是在真正的物理内存使用大小,不包括换页到swap上的部分。而且这个”share”说明这个大小可能被多个进程共享,最典型的是父子进程。MEM就是RES/物理内存大小 * 100%

其次VIRT是”the total amount of virtual memory used by the task”,说明这是这个进程的使用整个进程空间大小。

再次SWAP是VIRT与RES的差值。意为被换页出去的内存大小。看起来这部分内存被放到SWAP分区上了,但简单计算一下就可以看出不是这么回事儿,每个进程的SWAP大小加起来要远远超过所使用的SWAP分区的大小。

再次CODE和DATA分别代表代码段和数据与堆栈段,CODE+DATA与VIRT接近,但从观察的结果来看,不一定接近。

以进程pcmanx为例,CODE(248kb) + DATA(78mb) 远小于RES(10mb) + SWAP(243mb)。

这说明,进程空间往往远大于CODE+DATA。因为在执行过程中会free掉部分malloc出来的内存,进程空间没有减小,但DATA段大小减小。这样分析是否正确?

最后SHR看起来就没什么意义,因为”could be potentially shared with other processes”可能也就代表代码段和动态链接的库的大小?这只是我的猜测。

因此可以总结为,从RES看物理内存中的占用量,但这部分占用量是可能被”share”的;从VIRT看进程的进程空间大小,从DATA看进程现在所持有的数据大小。

开博的理由

01月 1, 2010

新千年的第一个十年已经过去。回顾这十年,十年前是我上升的开始,十年之后的现在恐怕还需要再过十年才能评价。在这样一个有意义的日子里开始我的博客,我希望我能坚持下去。

和一个朋友探讨过写博客,同感是写博客需要很多时间,忙起来未必能拿出来这部分时间。引申一步说,学习也需要很多时间,工作忙起来了也未必能拿出来这部分时间;锻炼也需要很多时间,其它事情忙起来了也未必能拿出来这部分时间;和亲人在一起也需要很多时间,等等。看起来,我真的是比日理万机还要日理万机。所以我又想,既然我还没有到日理万机,这些时间我就应该能拿出来。

我认为锻炼身体、学习和总结是我在工作中常常忽略的重要内容。这几部分内容都着眼于长期的回报,我想在这种问题上不能短视。

于是就有了今天这篇博客,我也正式开博了。


加关注

Get every new post delivered to your Inbox.