Python GIL的一个实验

2015年11月16日 00:46

 

看了这篇介绍GIL的文章,写的真好,GIL = Global Interpreter Lock, 全局解释器锁,在解释器解释执行任何Python代码时,都需要先获得这把锁才行,也就是一个Python解释器在任意时候都只能跑一个线程,在我的Macbook Pro上跑个实验试试,这些是我本本的参数:

 

CPU: 2.8 GHz Intel Core i7

➜  Desktop  sysctl -a | grep cpu

➜  sysctl -a | grep cpu

hw.ncpu: 4  # 系统使用的cpu数目是4个

hw.activecpu: 4

hw.physicalcpu: 2  # 物理cpu数目是2个

hw.physicalcpu_max: 2

hw.logicalcpu: 4

hw.logicalcpu_max: 4

...

machdep.cpu.brand_string: Intel(R) Core(TM) i7-4558U CPU @ 2.80GHz

...

machdep.cpu.logical_per_package: 16

machdep.cpu.cores_per_package: 8  # 这个不太清楚是啥

...

machdep.cpu.core_count: 2  # 双核

machdep.cpu.thread_count: 4  # 可以跑4线程,即4个Python解释器都跑死循环就能把CPU占到100%

 

实验很简单了,就是写死循环占cpu,先开一个terminal,运行命令top,查看进程和cpu使用情况,然后不断地开terminal,进python,跑死循环:

 

➜  python

Python 2.7.10 (default, Oct 17 2015, 01:15:29) 

[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> while True: pass

...

 

开1个的时候, top命令显示的CPU usage在25%左右

2个,50%左右

3个,70%左右(好奇为啥没到75%)

4个,98%左右(最大的数看到了99.3%)

5个,98%左右

6个,98%左右

 

所以在我的机器上一个python解释器只能获得1/4的cpu资源,虐一下自己的机器挺爽的,听到风扇声一下子就起来了,哈哈~ 最后再安利一下Python大法好,写个死循环都只需要一行~

用Python分割图片 (PIL)

2014年3月10日 01:39

今天试了下Python Imaging Library, 分割图片真方便, 当然还有其他逆天功能。有幅图片 a.bmp , 宽度1600, 高度1200, 需要把它均匀分割成相等大小的4份。

 

继续阅读

解法还挺多的, 这里有3种。

继续阅读

OSX 10.9安装PyDev

2014年2月22日 18:45

PyDev是Eclipse的一个Python IDE插件, Eclipse Marketplace里只能安装最新的3.3.3版本,装完以后PyDev并没有出现。可以手动安装PyDev2。系统是OSX 10.9.1, Eclipse版本是Kepler SP1。

继续阅读

C++指针的constant和don't

2014年2月20日 13:33

C++使用两种memory: heap和stack。Stack存储每个函数的信息,包括instructions, variables defined in that function。如果函数1 call 函数2, 函数2的信息存到stack顶部。函数return时,它的所有信息被pop。Heap存global variables, C++允许程序员自己在heap上分配内存, 即new(), new总是返回指向分配在heap的内存的指针。程序员必须自己释放掉不再需要的内存, 即delete。

继续阅读

摘自维基百科

 

内存按chunk分配,每个程序保留的chunk的大小和时间都不同。一个程序可以多次请求和释放memory chunk。程序一开始时,空闲内存有很多并且连续,随后大的连续的内存区域碎片化,变成更小的连续区域,最终程序无法获取大的连续的memory chunk。

 

1) Internal fragmentation = 分给程序的内存比它实际需要的多,多分的内存被浪费。

继续阅读

Endianness=端序=尾序=字节顺序

 

Little-endian=小端序=低位字节存在低内存地址处,(x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器)

Register:0A0B0C0D   Memory: a存0D a+1存0C a+2存0B a+3存0A

 

Big-endian=大端序=反之,(Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器)

Register:0A0B0C0D   Memory: a存0A a+1存0B a+2存0C a+3存0D

 

继续阅读

product 笛卡尔积

permutations 排列

combinations 组合,没有重复

combinations_with_replacement 组合,有重复

 

继续阅读

for (int i = 0; i < 20000; ++i)

    for (int j = 0; j < 2000; ++j)

        for (int k = 0; k < 200; ++k)

            testFunction(i, j, k);

怎么优化?

继续阅读

setuid, seteuid函数

2013年12月10日 12:43

不错的一篇文章

32位和64位什么区别?

2013年12月05日 20:41

大致翻译了一下这篇文章,作者Eric Escobar

 

64位和32位的区别?

 

64位或32位指处理器。一个64位的计算机处理器能处理用64比特表示的内存和数据。如果计算机是银行,一台32位计算机有32个取款机,64位计算机有64个取款机。

继续阅读

文章来自阮一峰的网络日志, 清晰易懂。

数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据,比如B+-tree。

 

这篇文章讲得很明白: http://www.cnblogs.com/aspnethot/articles/1504082.html

 

尤其喜欢那个关于字典的例子:

 

    汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然地翻开字典的前几页,因为“安”的拼音是“an”,而按照拼音排序汉字的字典是以英文字母“a”开头并以“z”结尾的,那么“安”字就自然地排在字典的前部。

继续阅读

OS X 10.9的词典很好用,三指点击就出释义,但自带的英汉词典词库略小,可用DictUnifier来扩展词库。

 

DictUnifier:https://code.google.com/p/mac-dictionary-kit/downloads/list

我下载的是DictUnifier 2.1,如果提示打不开,因为来自身份不明的开发者,那就按住ctrl键,点击图标,选择打开。

 

词典:http://abloz.com/huzheng/stardict-dic/zh_CN/  

下载的是.tar.bz2格式的词典,将它拖入DictUnifier窗口中即可,转换过程比较漫长。

 

打开词典,菜单栏词典-->偏好设置,选择自己需要的词典就OK了。

OS X下没有apt-get, 试试homebrew

2013年11月18日 00:19

看的这篇教程

 

查找软件包 brew search wget

安装软件包 brew install wget

列出已安装的软件包 brew list

继续阅读

看着http://dev.mysql.com/doc/refman/5.5/en/tutorial.html做的
安装:http://wiki.ubuntu.org.cn/MySQL,首先sudo start mysql, 让mysqld跑起来
MySQL命令不区分大小写,混用也没有问题。
 

继续阅读

import itertools
x = [10, 20, 30, 40, 50]
len = 3
for i in itertools.permutations(x, len):
    if i == tuple(sorted(i)): print i

Ubuntu下格式化U盘

2013年10月29日 21:00

1. 先卸载  sudo umount /media/kitt/KINGSTON

2. 查看U盘序号  sudo fdisk -l  如/dev/sdc

3. FAT32格式  sudo mkfs.vfat -F 32 /dev/sdc 

ext4格式  sudo mkfs.ext4 /dev/sdc, 也可ext3,ext2

NTFS格式  sudo apt-get install ntfsprogs   sudo mkfs.ntfs /dev/sdc

For TCP, no. You can only have one application listening on a single port at one time.

Now if you had 2 network cards, you could have one application listen on the first IP and the second one on the second IP using the same port number.

For UDP (Multicasts), multiple applications can subscribe to the same port.

http://www.cnblogs.com/kym/archive/2012/05/14/2498728.html

这篇文章谈到需要pyc文件时只要import就好了, Python是先编译后解释的语言。

http://blog.csdn.net/sislcb/article/details/4002414

这篇文章谈到用py_compile模块把.py文件编译成.pyc文件