东东东 陈煜东的博客

月份存档: 五月 2017

WordPress super cache 出现 cURL Problem with the SSL CA cert

为了让博客加快访问速度,使用了 WP Super Cache 插件。不得不说,这个插件还是比较好用的,对网页的打开速度体验提升很大。平时打开需要 700ms 的网页,现在只要 100ms 左右就可以啦。

按照网上的教程,一步一步的操作,将这些配置好了,但是很奇怪的是,缓存页面的过期效果一直不是自己预期的那样的。

缓存在后台设置了 1800s 的过期时间,那么正常情况下,如果上次的缓存时间超过了这个时间,应该会更新新的缓存网页,但是这个家伙一直都不更新。

点击了 缓存测试,测试一下,发现有失败。

cURL: Problem with the SSL CA cert (path? access rights?)

从字面翻译一下,说是SSL的 CA 证书有问题。考虑目前的机器版本比较老,这个情况是存在的,因此需要更新一下 CA 的证书文件。

通过从互联网上下载最新的文件,来更新一下证书。

curl https://curl.haxx.se/ca/cacert.pem -o /etc/pki/tls/certs/ca-bundle.crt

更新后,在点击测试缓存,可以显示成功了。

wp-super-cache-test-cache

现在缓存的策略能够正常工作了,网页上需要展示的一些数据也被刷新了。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: WordPress super cache 出现 cURL Problem with the SSL CA cert – https://www.chenyudong.com/archives/wordpress-super-cache-curl-problem-with-the-ssl-ca-cert.html

分类: WordPress

【偏方】 Python 寻找子列表是否存在与其他列表中

有一个 Python 技术优化,是判断一个列表是否属于另外一个列表,注意列表是有顺序的,不是集合。本来一直想找一个大方的简洁方法的,但没想到最后是通过偏门来解决的。

例如:

l = [(1, 2), (3, 4), (5, 6), (7, 8)]
find = [(3, 4), (5, 6)]

# 期望输出
find in l  -> True

字符串的启发

字符串有一些操作。

l = 'abcdefg'
>>> l.index('ef')
4

>>> l.index('h')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

字符串有index方法,可以很方便的判断子字符串是否在给定的字符串中,但是列表类的操作,一直没有找到这类的方法。

在和同事的讨论中,同事给了一个启发,使用repr函数获取可以试试。

用字符串的index函数还有一个好处,就是如果子串不在父串中,直接抛出异常,Python 不像其他语言一样,返回-1

repr转成字符串来处理

l = [(1, 2), (3, 4), (5, 6), (7, 8)]
find = [(3, 4), (5, 6)]

>>> repr(l)
'[(1, 2), (3, 4), (5, 6), (7, 8)]'
>>> repr(find)
'[(3, 4), (5, 6)]'

>>> repr(l)[1:-1].index(repr(find)[1:-1])
8
>>> repr(l)[1:-1].index(repr([(5, 5)])[1:-1])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: substring not found

使用join操作的字符串来判断

http://stackoverflow.com/a/2250981 中获得启发,也是利用字符串的方来进行解决的。

>>> ''.join(map(repr, [(3, 4)])) in ''.join(map(repr, [(1, 2), (3, 4)]))
True

不得不说,对比两个方法,其实都是类似的原理,都是通过字符串的字串来进行比较。思路很新颖,直观给人不用for循环进行处理,代码看上去也很简洁。

但是这些方法也只能是说判断子列表是否存在于另外一个列中的,不能判断子列表在另外一个列表的索引值。

另外该方法也不能保证子串只出现一次的情况。

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: 【偏方】 Python 寻找子列表是否存在与其他列表中 – https://www.chenyudong.com/archives/python-find-lists-in-lists.html

分类: Python

Python 将两层列表展开平铺成一层的5种方法

这几天和同事在讨论,如何用 Python 写出优雅的让列表中的列表展开,变成扁平化的列表。

例如

# 期望输入
input = [[('A', 1), ('B', 2)], [('C', 3), ('D', 4)]]

# 期望输出
output = [('A', 1), ('B', 2), ('C', 3), ('D', 4)]

map 函数合并

>>> new = []; map(new.extend, input); new
[None, None]
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

这个方法看上去还可以,但是有个致命的缺点,就是map函数会返回值,并且这个返回值是没有用的。另外还需要提前声明一个变量,从代码的简洁性上,不够简洁优雅。

sum 函数合并

>>> sum(input, [])
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

这个看上去很简洁,不过有类似字符串累加的性能陷阱。后面有性能对比。

reduce 函数

>>> reduce(list.__add__, input)
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

做序列的累加操作。也是有累加的性能陷阱。

列表推导式

>>> [item for sublist in input for item in sublist]
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

列表推导式,看着有些长,而且还要for循环两次,变成一行理解需要费劲一些,没有那么直观。

itertools 类库

>>> list(itertools.chain(*input))
[('A', 1), ('B', 2), ('C', 3), ('D', 4)]

通过第三方类库类实现的,相比其他的几个实现,看着还算比较优雅。最后的性能发现居然还很高。

性能大对比

python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'reduce(list.__add__,l)'
1000 loops, best of 3: 547 usec per loop

python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'sum(l, [])'
1000 loops, best of 3: 509 usec per loop

python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
10000 loops, best of 3: 52.8 usec per loop

python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99; import itertools;' 'list(itertools.chain(*l))'
10000 loops, best of 3: 35.9 usec per loop

python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'new = []; map(new.extend, l); new'
10000 loops, best of 3: 34.1 usec per loop

欢迎大家共同探讨优雅的的实现和性能的优化。

参考:http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python

声明:未经允许禁止转载 东东东 陈煜东的博客 文章,谢谢。如经授权,转载请注明: 转载自东东东 陈煜东的博客

本文链接地址: Python 将两层列表展开平铺成一层的5种方法 – https://www.chenyudong.com/archives/python-make-flat-list-of-list.html

分类: Python

Copyright © 2017 东东东 陈煜东的博客 粤ICP备13059639号-1

SITEMAP回到顶部 ↑