python

利用dropbox自动备份网站数据

我等小blog网站自然是用不上高大上的备份方案, 但是不备份后果很严重, 万一那天VPS公司跑路了, 或者机器挂了, 东西就全没鸟.

穷人只用的起免费的Dropbox =.=

安装

根据自己安装版本选择32或者64位的, 解压后会有一个.dropbox-dist的隐藏目录.

1
2
3
4
5
6
7
# Stable 32-bit:
wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86"
 
# Or stable 64-bit:
wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86_64"

tar -xvf dropbox.tar.gz

第一次在cmdline运行的时候, 会提示通过一个链接绑定帐号, 照着做就行了.

1
~/.dropbox-dist/dropbox

然后就会在home目录下建立一个Dropbox的目录.

计算n的阶乘末尾有多少个0

计算n的阶乘末尾有多少个0,例如5! = 120 末尾有1个0,10!= 3628800末尾有2个0。

  • 对于一个多因式相乘, 末尾有多少个0, 取决于有多少个10相乘.
  • 10的倍数也可以为结果贡献0, 比如10, 20, 30, 因此可以记为 P = i * 10
  • 10可以因式分解成5 2, 于是 P = i 5 * 2
  • 对于n!, 共有1 2 ... * n

operator module 加速简单函数

众所周知Python function call的开销比较大, function函数可以获得比较好的封装性, 但是如果只是进行简单的操作, 比如像下面一样, 只把两个数相加, 可能得不偿失.

1
2
def add(x, y):
    return x + y

operator module定义了一组function, 可以对简单的操作符进行封装;它是以C实现的, 直接调用C函数, 省去了function call的开销. 以下只用"+" 操作符作为栗子, 其他的可以查询文档.

与lambda对比测试

1
2
3
4
>>> timeit('add(1, 1)', 'add = lambda x, y: x + y')
0.17214393615722656
>>> timeit('add(1, 1)', 'add = __import__("operator").add')
0.11670303344726562

单个函数看, 有30%的效率提升.

[python] garbage collection 和 weakref

默认情况下, 引用计数(ref count) 已经能cover大部分管理, 被引用时候, 计数加一, 去引用时候, 减一;计数为零时候触发回收操作(对象不一定被销毁, python里有很多对象缓冲池).

Problem 1: 循环引用

引用计数有一个致命的缺点, 当出现循环引用的时候, 就无效了.

为此, python gc collection 为此而生. 监控循环引用.

首先, 定义一个函数触发gc机制(默认是有一个阀值才会触发, 这里我们可以调用gc.collect()手动触发).

[python] array of empty list

in bucket sort, I want to generate a array of empty bucket, so I did in this way:

1
2
3
>>> l = [[]] * 3
>>> l
[[], [], []]

Then the problem is when I try to append one element to bucket[0], it affects all the rest.

1
2
3
>>> l[0].append(1)
>>> l
[[1], [1], [1]]