Eric 发布的文章

Python 字典的合并效率

在 Python 编程中,字典的使用频率非常高,合并操作也很常见。

x = {'name':'Eric', 'age':28}
y = {'age':29, 'hobby':['sport', 'travel']}

例如要合并这两个字典:更新其中某项,并添加新项。你能想到什么办法?

  1. update 方法

    z = x.copy()
    z.update(y)

  2. 使用 dict() 函数的字典参数

    z = dict(x, **y)

  3. items 变换

    z = dict(x.items() + y.items())

  4. lambda 表达式

    z = (lambda a, b: (lambda a_copy: a_copy.update(b) or a_copy)(a.copy()))(x, y)

这些方法都可以达到要求,哪种效率最高呢?

我们可以使用 timeit 模块来测试它们的运行效率。

import timeit

# 1 update 方法
timeit.timeit("z = x.copy(); z.update(y)", "x = {'name':'Eric', 'age':28}; y = {'age':29, 'hobby':['sport', 'travel']}")
# output: 0.31891608238220215

# 2 使用 dict() 函数的字典参数
timeit.timeit("z = dict(x, **y)", "x = {'name':'Eric', 'age':28}; y = {'age':29, 'hobby':['sport', 'travel']}")
# output: 0.30063605308532715

# 3 items 变换
timeit.timeit("z = dict(x.items() + y.items())", "x = {'name':'Eric', 'age':28}; y = {'age':29, 'hobby':['sport', 'travel']}")
# output: 0.8453028202056885

# 4 lambda 表达式
timeit.timeit("(lambda a, b: (lambda a_copy: a_copy.update(b) or a_copy)(a.copy()))(x, y)", "x = {'name':'Eric', 'age':28}; y = {'age':29, 'hobby':['sport', 'travel']}")
# output: 0.6631548404693604

结果显示,方法1和2效率最高,且两者运行时间差不多。其次是方法4,最差的是方法3。(对运行时间的计算,多次运行取平均值会更准确一点。)

总结下来,运行效率用公式表示如下:
1 = 2 > 4 > 3

Nginx + PHP 设置文件上传大小

你可能会碰到服务器 413 错误,当文件上传到服务器时,返回如下结果:

HTTP/1.1 413 Request Entity Too Large

原因

服务器限制了文件上传大小。默认大小,Nginx 为1M,PHP 为2M。因此超过1M便返回413.

如何修改大小限制

需要同时修改 PHP 和 Nginx 的配置。

PHP

编辑 php.ini 文件,找到对应的位置:

; Maximum size of POST data that PHP will accept.
; http://php.net/post-max-size
post_max_size = 10M

; Maximum allowed size for uploaded files.
; http://php.net/upload-max-filesize
upload_max_filesize = 8M

post_max_size 指表单 POST 数据的最大值;
upload_max_filesize 指上传文件的最大值;
注意:这个参数 file_uploads = On,确保它是打开的。

Nginx

编辑 nginx.conf 文件或者子配置文件,在 server 段的 location 中配置:

location / {
    root   /home/eric/workspace/GameFeedback/www;
    index  index.html index.htm index.php;
    if (!-e $request_filename) {
        rewrite ^/(.*)$ /index.php?/$1 last;
    }
    client_max_body_size 8m;
}

location ~ \.php$ {
    root           /home/eric/workspace/GameFeedback/www;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
    client_max_body_size 8m;
}

注意:两个 location 都要配置,否则无效。

最后,需要重启 Nginx 服务;如果是 php-fpm,也要重启以使配置生效。

Linux 命令之 kill

杀掉进程。

命令格式

kill [-<signal_name|signal_number>] <pid>

其中 pid 是进程ID。

选项可以是信息名称或信号编号。

信号

kill -l
可以查看全部支持的信号。

linux_signals.jpeg

常用信号

编号名称说明
1SIGHUP让进程立即关闭,然后重新读取配置文件再启动
2SIGINT终止前台进程,相当 ctrl+c
9SIGKILL立即结束进程,不能被阻塞、捕获、忽略
15SIGTERM正常结束进程,kill 命令的默认信号。如果进程已经发生了问题,那么无法通过该信号正常终止进程
18SIGCONT让暂停的进程恢复执行
19SIGSTOP暂停前台进程,相当于 ctrl+z

kill 与 kill -9 的区别

默认情况下(即不指定信号参数时),使用的是 SIGTERM(15)信号。它告诉进程,你需要被关闭,请自行停止并退出。
kill -9 是发送 SIGKILL 信号给进程,通过内核将进程直接终止,该进程在毫无准备的情况下被关闭了。SIGKILL 信号不能被捕获或忽略,接收到该信号的进程不能执行任何清理。

Linux 命令之系统任务

系统任务是由多个功能命令完成的。什么是任务,执行一条命令,可称之为一个任务,尤其是需要长时间运行的命令。

查看任务

jobs

选项
-l 可以查看到相应进程的 ID

参数
<jobnumber> 任务序号,如果输入该参数,则只查看该任务

列表的组成
[序号1]+ 任务状态 任务命令
[序号2]- 任务状态 任务命令
[序号3] 任务状态 任务命令

其中序号为任务序号(jobnumber),+ 表示当前任务,- 表示当前任务的下一个任务,没有符号的任务为更远的任务。
任务状态有:Running(运行中),Suspended(挂起),Stopped(已停止),Terminated(已终止),Killed(被杀掉了)。
其中已终止的任务很快会从任务列表中消失。

前台任务&后台任务

执行命令后,占据命令行提示符,表示该任务是前台运行,无法在该 shell 中输入其它命令。
在命令的末尾加上 & 符号,可使命令在后台运行。此时可继续输入其它命令。

将前台任务转到后台运行

按下 ctrl+z 将任务挂起,再通过 jobs 命令可查看到任务序号(jobnumer),然后通过 bg %<jobnumber> 将挂起的任务继续在后台运行。

将后台任务转到前台运行

fg %<jobnumber>
如果不加任何参数,则是将当前任务转到前台。
fg 是 foreground 的意思。

将后台任务继续运行

bg %<jobnumber>
如果不加任何参数,则是将当前任务在后台继续运行(该任务此前可能是挂起状态)。
bg 是 background 的意思。

终止进程

终止后台进程

kill %<jobnumber>
kill <pid>
通过 jobs -l 可以查看到进程 ID(pid)。

终止前台进程

ctrl+c

附加

键盘操作的含义

ctrl+c kill foreground process 杀掉前台进程
ctrl+z suspend foreground process 挂起前台进程
ctrl+d terminate input, or exit shell 结束输入,或者退出 shell
ctrl+s suspend output 挂起输出
ctrl+q resume output 恢复输出
ctrl+o discard output 丢弃输出
ctrl+l clear screen 清屏

Git 使用 .gitignore 忽略特殊文件

Git 是非常强大的版本控制与管理工具。在使用的过程中,提交文件时,经常需要忽略某些文件。如编译后的二进制文件。

Git 可以使用 .gitignore 文件来忽略这些文件。在项目根目录下,创建 .gitignore 文件,并写入忽略规则即可。例如 Python 项目,一般需要忽略所有编译后的文件 *.pyc 。如下是一个示例:

.gitignore
*.pyc

忽略规则说明:

1.过滤

忽略整个文件夹中的文件

/tmp/

忽略某个文件

site_settings.py

忽略某类文件,使用通配符

*.pyc

2.不过滤

!*.setting

说明,不过滤是在过滤的相反意思,只要在过滤规则前加叹号 ! ,表示不忽略这些文件(夹)。在 .gitignore 文件中,使用 # 来表示注释。

还可以设置一个全局的忽略文件,就不用在每个项目中都设置该文件。

在 git 的配置文件中设置:

cat ~/.gitconfig
[core]
    excludesfile = ~/.gitignore_global

然后在用户目录中添加文件 .gitignore_global,其内容与上面的一致。