cumshot(如何提高Python代码的性能)
资讯
2023-11-09
391
1. cumshot,如何提高Python代码的性能?
Python Files 博客发布了几篇主题为「Hunting Performance in Python Code」的系列文章,对提升 Python 代码的性能的方法进行了介绍。在其中的每一篇文章中,作者都会介绍几种可用于 Python 代码的工具和分析器,以及它们可以如何帮助你更好地在前端(Python 脚本)和/或后端(Python 解释器)中找到瓶颈。代码地址:https://github.com/apatrascu/hunting-python-performance
目录
一、环境设置
二、内存分析
三、CPU 分析——Python 脚本
四、CPU 分析——Python 解释器(略)
一、环境设置
设置
在深入到基准测试和性能分析之前,首先我们需要一个合适的环境。这意味着我们需要为这项任务配置我们的机器和操作系统。
我的机器的规格如下:
处理器:Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz
内存:32GB
操作系统:Ubuntu 16.04 LTS
Kernel:4.4.0-75-generic
我们的目标是得到可复现的结果,因此要确保我们的数据不会受到其它后台进程、操作系统配置或任何其它硬件性能提升技术的影响。
让我们首先从配置用于性能分析的机器开始。
硬件功能
首先,禁用所有硬件性能功能,也就是说要禁用 Intel Turbo Boost 和 Hyper Threading from BIOS/UEFI。
正如其官方网页上说的那样,Turbo Boost 是「一种在处理器内核运行,并可以在低于功耗、电流和温度规格限制的情况下允许它们以高于额定频率的速度运行的技术。」此外,Hyper Threading 是「一种可以更高效地利用处理器资源的技术,能使每个内核都能多线程运行。」
这都是值得我们花钱购买的好东西。那为什么要在性能分析/基准测试中禁用它们呢?因为使用这些技术会让我们无法得到可靠的和可复现的结果。这会让运行过程发生变化。让我们看个小例子 primes.py,代码故意写得很糟糕。
import time
import statistics
def primes(n):
if n==2:
return [2]
elif n<2:
return []
s=range(3,n+1,2)
mroot = n ** 0.5
half=(n+1)/2-1
i=0
m=3
while m <= mroot:
if s[i]:
j=(m*m-3)/2
s[j]=0
while j<half:
s[j]=0
j+=m
i=i+1
m=2*i+3
return [2]+[x for x in s if x]
def benchmark():
results = []
gstart = time.time()
for _ in xrange(5):
start = time.time()
count = len(primes(1000000))
end = time.time()
results.append(end-start)
gend = time.time()
mean = statistics.mean(results)
stdev = statistics.stdev(results)
perc = (stdev * 100)/ mean
print "Benchmark duration: %r seconds" % (gend-gstart)
print "Mean duration: %r seconds" % mean
print "Standard deviation: %r (%r %%)" % (stdev, perc)
benchmark()
这段代码可在 GitHub 上查看:https://github.com/apatrascu/hunting-python-performance/blob/master/01.primes.py。你需要运行以下命令安装一个依赖包:
pip install statistics
让我们在一个启用了 Turbo Boost 和 Hyper Threading 的系统中运行它:
python primes.py
Benchmark duration: 1.0644240379333496 seconds
Mean duration: 0.2128755569458008 seconds
Standard deviation: 0.032928838418120374 (15.468585914964498 %)
现在禁用该系统的睿频加速(Turbo Boost)和超线程(Hyper Threading),然后再次运行这段代码:
python primes.py
Benchmark duration: 1.2374498844146729 seconds
Mean duration: 0.12374367713928222 seconds
Standard deviation: 0.000684464852339824 (0.553131172568 %)
看看第一个案例的标准差为 15%。这是一个很大的值!假设我们的优化只能带来 6% 的加速,那我们怎么能将运行过程中的变化(run to run variation)和你的实现的差异区分开?
相对而言,在第二个例子中,标准差减少到了大约 0.6%,我们的新优化方案效果清晰可见。
CPU 节能
禁用所有的 CPU 节能设置,并使用固定的 CPU 频率。这可以通过在 Linux 功率调节器(power governor)中将 intel_pstate 改成 acpi_cpufreq 而实现。
intel_pstate 驱动使用英特尔内核(Sandy Bridge 或更新)处理器的内部调节器实现了一个缩放驱动。acpi_cpufreq 使用了 ACPI Processor Performance States。
下面让我们先来检查一下:
$ cpupower frequency-info
analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 0.97 ms.
hardware limits: 1.20 GHz - 3.60 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 1.20 GHz and 3.60 GHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 1.20 GHz.
boost state support:
Supported: yes
Active: yes
可以看到这里所使用的调节器被设置成了节能模式,而 CPU 的频率范围在 1.20 GHz 到 3.60 GHz 之间。这个设置对日常应用来说是很不错的,但却会影响到基准测试的结果。
那么应该给调节器设置什么值呢?如果我们浏览一下文档,我们可以看到我们可以使用以下设置:
高性能(performance):以最大频率运行 CPU
节能(powersave):以最小频率运行 CPU
自定义(userspace):按用户指定的频率运行 CPU
按需(ondemand):根据当前负载动态调节频率。可能跳至最高频率,空闲时又会降低
保守(conservative):根据当前负载动态调节频率。相比于按需模式,其频率调节更加渐进
我们要使用性能调节器(performance governor),并将频率设置成 CPU 支持的最大频率。如下所示:
$ cpupower frequency-info
analyzing CPU 0:
driver: acpi-cpufreq
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 10.0 us.
hardware limits: 1.20 GHz - 2.30 GHz
available frequency steps: 2.30 GHz, 2.20 GHz, 2.10 GHz, 2.00 GHz, 1.90 GHz, 1.80 GHz, 1.70 GHz, 1.60 GHz, 1.50 GHz, 1.40 GHz, 1.30 GHz, 1.20 GHz
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
current policy: frequency should be within 2.30 GHz and 2.30 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency is 2.30 GHz.
cpufreq stats: 2.30 GHz:100.00%, 2.20 GHz:0.00%, 2.10 GHz:0.00%, 2.00 GHz:0.00%, 1.90 GHz:0.00%, 1.80 GHz:0.00%, 1.70 GHz:0.00%, 1.60 GHz:0.00%, 1.50 GHz:0.00%, 1.40 GHz:0.00%, 1.30 GHz:0.00%, 1.20 GHz:0.00% (174)
boost state support:
Supported: no
Active: no
现在你已经使用性能调节器将频率设置成了固定的 2.3 GHz。这是最大的可设置的值,没有睿频加速(Turbo Boost),它可以被用在 Xeon E5-2699 v3 上。
要完成设置,请使用管理员权限运行以下命令:
cpupower frequency-set -g performance
cpupower frequency-set --min 2300000 --max 2300000
如果你没有 cpupower,可使用以下命令安装:
sudo apt-get install linux-tools-common linux-header-`uname -r` -y
功率调节器对 CPU 的工作方式有很大的影响。该调节器的默认设置是自动调节频率以减少功耗。我们不想要这样的设置,所以从 GRUB 中禁用它。只需要编辑 /boot/grub/grub.cfg(但是如果你在 kernel 升级上很小心,那么这将会消失)或在 /etc/grub.d/40_custom 中创建一个新的 kernel 入口。我们的 boot 行中必须包含这个 flag: intel_pstate=disable,如下所示:
linux /boot/vmlinuz-4.4.0-78-generic.efi.signed root=UUID=86097ec1-3fa4-4d00-97c7-3bf91787be83 ro intel_pstate=disable quiet splash $vt_handoff
ASLR(地址空间配置随机发生器)
这个设置是有争议的,参见 Victor Stinner 的博客:https://haypo.github.io/journey-to-stable-benchmark-average.html。当我首次建议在基准测试时禁用 ASLR 时,那是为了进一步提升对那时在 CPython 中存在的 Profile Guided Optimizations 的支持。
我为什么要说这个呢?因为在上面给出的特定硬件上,禁用 ASLR 可以将运行之间的标准差降低至 0.4%。
另一方面,根据在我的个人计算机(Intel Core i7 4710MQ)上的测试,禁用 ASLR 会导致 Victor 所提到的同样的问题。在更小的 CPU(比如 Intel Atom)上的测试会带来甚至更大的运行间标准差。
因为这似乎并不是普遍适用的真理,而且很大程度上依赖于硬件/软件配置,所以对于这个设置,我在启用后测量一次,再禁用后测量一次,之后再进行比较。
在我的机器上,我通过在 /etc/sysctl.conf. 中加入以下命令禁用了 ASLR。使用 sudo sysctl -p 进行应用。
kernel.randomize_va_space = 0
如果你想在运行时禁用它:
sudo bash -c 'echo 0 >| /proc/sys/kernel/randomize_va_space'
如果你想重新启用:
sudo bash -c 'echo 2 >| /proc/sys/kernel/randomize_va_space'
二、内存分析
在这一节,我将介绍一些有助于我们解决 Python 中(尤其是使用 PyPy 时)的内存消耗难题的工具。
我们为什么要关心这个问题?为什么我们不仅仅就关心性能?这些问题的答案相当复杂,但我会总结出来。
PyPy 是一个可选的 Python 解释器,其相对于 CPython 有一些巨大的优势:速度(通过其 Just in Time 编译器)、兼容性(几乎可以替代 CPython)和并发性(使用 stackless 和 greenlets)。
PyPy 的一个缺点是因为其 JIT 和垃圾一样的回收站实现,它通常会使用比 CPython 更多的内存。但是在某些案例中,其的内存消耗会比 CPython 少。
下面我们来看看你可以如何测量你的应用使用了多少内存。
诊断内存使用
memory_profiler
memory_profiler 是一个可用来测量解释器运行一个负载时的内存用量的库。你可以通过 pip 安装它:
pip install memory_profiler
另外还要安装 psutil 依赖包:
pip install psutil
这个工具的优点是它会在一个 Python 脚本中一行行地显示内存消耗。这可以让我们找到脚本中可以被我们重写的位置。但这种分析有一个缺点。你的代码的运行速度比一般脚本慢 10 到 20 倍。
怎么使用它?你只需要在你需要测量的函数上直接加上 @profile() 即可。
让我们看看实际怎么操作!我们将使用之前用过的素材脚本作为模型,但做了一点修改,移除了统计部分。代码也可在 GitHub 查看:https://github.com/apatrascu/hunting-python-performance/blob/master/02.primes-v1.py
from memory_profiler import profile
@profile(precision=6)
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = range(3, n + 1, 2)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
return [2] + [x for x in s if x]
len(primes(100000))
开始测量时,使用以下 PyPy 命令:
pypy -m memory_profiler 02.primes-v3.py
或者直接在脚本中导入 memory_profiler:
pypy -m memory_profiler 02.primes-v3.py
在执行完这行代码之后,我们可以看到 PyPy 得到这样的结果:
Line # Mem usage Increment Line Contents
================================================
54 35.312500 MiB 0.000000 MiB @profile(precision=6)
55 def primes(n):
56 35.351562 MiB 0.039062 MiB if n == 2:
57 return [2]
58 35.355469 MiB 0.003906 MiB elif n < 2:
59 return []
60 35.355469 MiB 0.000000 MiB s = []
61 59.515625 MiB 24.160156 MiB for i in range(3, n+1):
62 59.515625 MiB 0.000000 MiB if i % 2 != 0:
63 59.515625 MiB 0.000000 MiB s.append(i)
64 59.546875 MiB 0.031250 MiB mroot = n ** 0.5
65 59.550781 MiB 0.003906 MiB half = (n + 1) / 2 - 1
66 59.550781 MiB 0.000000 MiB i = 0
67 59.550781 MiB 0.000000 MiB m = 3
68 59.554688 MiB 0.003906 MiB while m <= mroot:
69 59.554688 MiB 0.000000 MiB if s[i]:
70 59.554688 MiB 0.000000 MiB j = (m * m - 3) / 2
71 59.554688 MiB 0.000000 MiB s[j] = 0
72 59.554688 MiB 0.000000 MiB while j < half:
73 59.554688 MiB 0.000000 MiB s[j] = 0
74 59.554688 MiB 0.000000 MiB j += m
75 59.554688 MiB 0.000000 MiB i = i + 1
76 59.554688 MiB 0.000000 MiB m = 2 * i + 3
77 59.554688 MiB 0.000000 MiB l = [2]
78 59.679688 MiB 0.125000 MiB for x in s:
79 59.679688 MiB 0.000000 MiB if x:
80 59.679688 MiB 0.000000 MiB l.append(x)
81 59.683594 MiB 0.003906 MiB return l
我们可以看到这个脚本使用了 24.371094 MiB 的 RAM。让我们简单分析一下。我们看到其中大多数都用在了数值数组的构建中。它排除了偶数数值,保留了所有其它数值。
我们可以通过调用 range 函数而对其进行一点改进,其使用一个增量参数。在这个案例中,该脚本看起来像是这样:
from memory_profiler import profile
@profile(precision=6)
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = range(3, n + 1, 2)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
l = [2]
for x in s:
if x:
l.append(x)
return l
len(primes(100000))
如果我们再次测量,我们可以得到以下结果:
Line # Mem usage Increment Line Contents
================================================
27 35.343750 MiB 0.000000 MiB @profile(precision=6)
28 def primes(n):
29 35.382812 MiB 0.039062 MiB if n == 2:
30 return [2]
31 35.382812 MiB 0.000000 MiB elif n < 2:
32 return []
33 35.386719 MiB 0.003906 MiB s = range(3, n + 1, 2)
34 35.417969 MiB 0.031250 MiB mroot = n ** 0.5
35 35.417969 MiB 0.000000 MiB half = (n + 1) / 2 - 1
36 35.417969 MiB 0.000000 MiB i = 0
37 35.421875 MiB 0.003906 MiB m = 3
38 58.019531 MiB 22.597656 MiB while m <= mroot:
39 58.019531 MiB 0.000000 MiB if s[i]:
40 58.019531 MiB 0.000000 MiB j = (m * m - 3) / 2
41 58.019531 MiB 0.000000 MiB s[j] = 0
42 58.019531 MiB 0.000000 MiB while j < half:
43 58.019531 MiB 0.000000 MiB s[j] = 0
44 58.019531 MiB 0.000000 MiB j += m
45 58.019531 MiB 0.000000 MiB i = i + 1
46 58.019531 MiB 0.000000 MiB m = 2 * i + 3
47 58.019531 MiB 0.000000 MiB l = [2]
48 58.089844 MiB 0.070312 MiB for x in s:
49 58.089844 MiB 0.000000 MiB if x:
50 58.089844 MiB 0.000000 MiB l.append(x)
51 58.093750 MiB 0.003906 MiB return l
很好,现在我们的内存消耗下降到了 22.75 MiB。使用列表解析(list comprehension),我们还可以将消耗再降低一点。
from memory_profiler import profile
@profile(precision=6)
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = range(3, n + 1, 2)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
return [2] + [x for x in s if x]
len(primes(100000))
再次测量:
Line # Mem usage Increment Line Contents
================================================
4 35.425781 MiB 0.000000 MiB @profile(precision=6)
5 def primes(n):
6 35.464844 MiB 0.039062 MiB if n == 2:
7 return [2]
8 35.464844 MiB 0.000000 MiB elif n < 2:
9 return []
10 35.464844 MiB 0.000000 MiB s = range(3, n + 1, 2)
11 35.500000 MiB 0.035156 MiB mroot = n ** 0.5
12 35.500000 MiB 0.000000 MiB half = (n + 1) / 2 - 1
13 35.500000 MiB 0.000000 MiB i = 0
14 35.500000 MiB 0.000000 MiB m = 3
15 57.683594 MiB 22.183594 MiB while m <= mroot:
16 57.683594 MiB 0.000000 MiB if s[i]:
17 57.683594 MiB 0.000000 MiB j = (m * m - 3) / 2
18 57.683594 MiB 0.000000 MiB s[j] = 0
19 57.683594 MiB 0.000000 MiB while j < half:
20 57.683594 MiB 0.000000 MiB s[j] = 0
21 57.683594 MiB 0.000000 MiB j += m
22 57.683594 MiB 0.000000 MiB i = i + 1
23 57.683594 MiB 0.000000 MiB m = 2 * i + 3
24 57.847656 MiB 0.164062 MiB return [2] + [x for x in s if x]
我们最后的脚本仅消耗 22.421875 MiB。相比于第一个版本,差不多下降了 10%。
三、CPU 分析——Python 脚本
在这一节,我将介绍一些有助于我们解决 Python 中的分析 CPU 使用的难题的工具。
CPU 性能分析(profiling)的意思是通过分析 CPU 执行代码的方式来分析这些代码的性能。也就是说要找到我们代码中的热点(hot spot),然后看我们可以怎么处理它们。
接下来我们会看看你可以如何追踪你的 Python 脚本的 CPU 使用。我们将关注以下分析器(profiler):
* cProfile
* line_profiler
* pprofile
* vprof
测量 CPU 使用
import time
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = []
for i in range(3, n+1):
if i % 2 != 0:
s.append(i)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
l = [2]
for x in s:
if x:
l.append(x)
return l
def benchmark():
start = time.time()
for _ in xrange(40):
count = len(primes(1000000))
end = time.time()
print "Benchmark duration: %r seconds" % (end-start)
benchmark()
这一节我将使用与前一节基本一样的脚本,你也可以在 GitHub 上查看:https://gist.github.com/apatrascu/8524679175de08a54a95e22001a31d3b
另外,记住在 PyPy2 上,你需要使用一个支持它的 pip 版本:
pypy -m ensure pip
其它东西可以通过以下指令安装:
pypy -m pip install
cProfile
在 CPU 性能分析上最常用的一个工具是 cProfile,主要是因为它内置于 CPython2 和 PyPy2 中。这是一个确定性的分析器,也就是说它会在运行我们的负载时收集一系列统计数据,比如代码各个部分的执行次数或执行时间。此外,相比于其它内置的分析器(profile 或 hotshot),cProfile 对系统的开销更少。
当使用 CPython2 时,其使用方法是相当简单的:
python -m cProfile 03.primes-v1.py
如果你使用的是 PyPy2:
pypy -m cProfile 03.primes-v1.py
其输出如下:
Benchmark duration: 30.11158514022827 seconds
23139965 function calls in 30.112 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 30.112 30.112 03.primes.py:1(<module>)
40 19.760 0.494 29.896 0.747 03.primes.py:3(primes)
1 0.216 0.216 30.112 30.112 03.primes.py:31(benchmark)
40 0.000 0.000 0.000 0.000 {len}
23139840 6.683 0.000 6.683 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
40 3.453 0.086 3.453 0.086 {range}
2 0.000 0.000 0.000 0.000 {time.time}
即使是这样的文本输出,我们也可以直接看到我们脚本的大多数时间都在调用 list.append 方法。
如果我们使用 gprof2dot,我们可以用图形化的方式来查看 cProfile 的输出。要使用这个工具,我们首先必须安装 graphviz。在 Ubuntu 上,可以使用以下命令:
apt-get install graphviz
pip install gprof2dot
再次运行我们的脚本:
python -m cProfile -o output.pstats 03.primes-v1.py
gprof2dot -f pstats output.pstats | dot -Tpng -o output.png
然后我们会得到下面的 output.png 文件:
这样看起来就轻松多了。让我们仔细看看它输出了什么。你可以看到来自你的脚本的一个函数调用图(callgraph)。在每个方框中,你可以一行一行地看到:
第一行:Python 文件名、行数和方法名
第二行:这个方框所用的时间占全局时间的比例
第三行:括号中是该方法本身所用时间占全局时间的比例
第四行:调用次数
比如说,在从上到下第三个红色框中,方法 primes 占用了 98.28% 的时间,65.44% 的时间是在该方法之中做什么事情,它被调用了 40 次。剩下的时间被用在了 Python 的 list.append(22.33%)和 range(11.51%)方法中。
这是一个简单的脚本,所以我们只需要重写我们的脚本,让它不用使用那么多 append,结果如下:
import time
def primes(n):
if n==2:
return [2]
elif n<2:
return []
s=range(3,n+1,2)
mroot = n ** 0.5
half=(n+1)/2-1
i=0
m=3
while m <= mroot:
if s[i]:
j=(m*m-3)/2
s[j]=0
while j<half:
s[j]=0
j+=m
i=i+1
m=2*i+3
return [2]+[x for x in s if x]
def benchmark():
start = time.time()
for _ in xrange(40):
count = len(primes(1000000))
end = time.time()
print "Benchmark duration: %r seconds" % (end-start)
benchmark()
如果我们在此之前和之后使用 CPython2 测量脚本的时间:
python 03.primes-v1.py
Benchmark duration: 15.768115043640137 seconds
python 03.primes-v2.py
Benchmark duration: 6.56312108039856 seconds
用 PyPy2 测量:
pypy 03.primes-v1.py
Benchmark duration: 1.4009230136871338 seconds
pypy 03.primes-v2.py
Benchmark duration: 0.4542720317840576 seconds
我们在 CPython2 上得到了 2.4 倍的提升,在 PyPy2 上得到了 3.1 倍的提升。很不错,其 cProfile 调用图为:
你也可以以程序的方式查看 cProfile:
import cProfile
pr = cProfile.Profile()
pr.enable()
function_to_measure()
pr.disable()
pr.print_stats(sort='time')
这在一些场景中很有用,比如多进程性能测量。更多详情请参阅:https://docs.python.org/2/library/profile.html#module-cProfile
line_profiler
这个分析器可以提供逐行水平的负载信息。这是通过 C 语言用 Cython 实现的,与 cProfile 相比计算开销更少。
其源代码可在 GitHub 上获取:https://github.com/rkern/line_profiler,PyPI 页面为:https://pypi.python.org/pypi/line_profiler/。和 cProfile 相比,它有相当大的开销,需要多 12 倍的时间才能得到一个分析结果。
要使用这个工具,你首先需要通过 pip 添加:pip install pip install Cython ipython==5.4.1 line_profiler(CPython2)。这个分析器的一个主要缺点是不支持 PyPy。
就像在使用 memory_profiler 时一样,你需要在你想分析的函数上加上一个装饰。在我们的例子中,你需要在 03.primes-v1.py 中的 primes 函数的定义前加上 @profile。然后像这样调用:
kernprof -l 03.primes-v1.py
python -m line_profiler 03.primes-v1.py.lprof
你会得到一个这样的输出:
Timer unit: 1e-06 s
Total time: 181.595 s
File: 03.primes-v1.py
Function: primes at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def primes(n):
5 40 107 2.7 0.0 if n == 2:
6 return [2]
7 40 49 1.2 0.0 elif n < 2:
8 return []
9 40 44 1.1 0.0 s = []
10 39999960 34410114 0.9 18.9 for i in range(3, n+1):
11 39999920 29570173 0.7 16.3 if i % 2 != 0:
12 19999960 14976433 0.7 8.2 s.append(i)
13 40 329 8.2 0.0 mroot = n ** 0.5
14 40 82 2.0 0.0 half = (n + 1) / 2 - 1
15 40 46 1.1 0.0 i = 0
16 40 30 0.8 0.0 m = 3
17 20000 17305 0.9 0.0 while m <= mroot:
18 19960 16418 0.8 0.0 if s[i]:
19 6680 6798 1.0 0.0 j = (m * m - 3) / 2
20 6680 6646 1.0 0.0 s[j] = 0
21 32449400 22509523 0.7 12.4 while j < half:
22 32442720 26671867 0.8 14.7 s[j] = 0
23 32442720 22913591 0.7 12.6 j += m
24 19960 15078 0.8 0.0 i = i + 1
25 19960 16170 0.8 0.0 m = 2 * i + 3
26 40 87 2.2 0.0 l = [2]
27 20000000 14292643 0.7 7.9 for x in s:
28 19999960 13753547 0.7 7.6 if x:
29 3139880 2417421 0.8 1.3 l.append(x)
30 40 33 0.8 0.0 return l
我们可以看到两个循环在反复调用 list.append,占用了脚本的大部分时间。
pprofile
地址:http://github.com/vpelletier/pprofile
据作者介绍,pprofile 是一个「行粒度的、可感知线程的确定性和统计性纯 Python 分析器」。
它的灵感来源于 line_profiler,修复了大量缺陷,但因为其完全是用 Python 写的,所以也可以通过 PyPy 使用。和 cProfile 相比,使用 CPython 时分析的时间会多 28 倍,使用 PyPy 时的分析时间会长 10 倍,但具有粒度更大的细节水平。
而且还支持 PyPy 了!除此之外,它还支持线程分析,这在很多情况下都很有用。
要使用这个工具,你首先需要通过 pip 安装:pip install pprofile(CPython2)/ pypy -m pip install pprofile(PyPy),然后像这样调用:
pprofile 03.primes-v1.py
其输出和前面工具的输出不同,如下:
Benchmark duration: 886.8774709701538 seconds
Command line: ['03.primes-v1.py']
Total duration: 886.878s
File: 03.primes-v1.py
File duration: 886.878s (100.00%)
Line #| Hits| Time| Time per hit| %|Source code
------+----------+-------------+-------------+-------+-----------
1| 2| 7.10487e-05| 3.55244e-05| 0.00%|import time
2| 0| 0| 0| 0.00%|
3| 0| 0| 0| 0.00%|
4| 41| 0.00029397| 7.17e-06| 0.00%|def primes(n):
5| 40| 0.000231266| 5.78165e-06| 0.00%| if n == 2:
6| 0| 0| 0| 0.00%| return [2]
7| 40| 0.000178337| 4.45843e-06| 0.00%| elif n < 2:
8| 0| 0| 0| 0.00%| return []
9| 40| 0.000188112| 4.70281e-06| 0.00%| s = []
10| 39999960| 159.268| 3.98171e-06| 17.96%| for i in range(3, n+1):
11| 39999920| 152.924| 3.82312e-06| 17.24%| if i % 2 != 0:
12| 19999960| 76.2135| 3.81068e-06| 8.59%| s.append(i)
13| 40| 0.00147367| 3.68416e-05| 0.00%| mroot = n ** 0.5
14| 40| 0.000319004| 7.9751e-06| 0.00%| half = (n + 1) / 2 - 1
15| 40| 0.000220776| 5.51939e-06| 0.00%| i = 0
16| 40| 0.000243902| 6.09756e-06| 0.00%| m = 3
17| 20000| 0.0777466| 3.88733e-06| 0.01%| while m <= mroot:
18| 19960| 0.0774016| 3.87784e-06| 0.01%| if s[i]:
19| 6680| 0.0278566| 4.17015e-06| 0.00%| j = (m * m - 3) / 2
20| 6680| 0.0275929| 4.13067e-06| 0.00%| s[j] = 0
21| 32449400| 114.858| 3.5396e-06| 12.95%| while j < half:
22| 32442720| 120.841| 3.72475e-06| 13.63%| s[j] = 0
23| 32442720| 114.432| 3.5272e-06| 12.90%| j += m
24| 19960| 0.0749919| 3.75711e-06| 0.01%| i = i + 1
25| 19960| 0.0765574| 3.83554e-06| 0.01%| m = 2 * i + 3
26| 40| 0.000222206| 5.55515e-06| 0.00%| l = [2]
27| 20000000| 68.8031| 3.44016e-06| 7.76%| for x in s:
28| 19999960| 67.9391| 3.39696e-06| 7.66%| if x:
29| 3139880| 10.9989| 3.50295e-06| 1.24%| l.append(x)
30| 40| 0.000155687| 3.89218e-06| 0.00%| return l
31| 0| 0| 0| 0.00%|
32| 0| 0| 0| 0.00%|
33| 2| 8.10623e-06| 4.05312e-06| 0.00%|def benchmark():
34| 1| 5.00679e-06| 5.00679e-06| 0.00%| start = time.time()
35| 41| 0.00101089| 2.4656e-05| 0.00%| for _ in xrange(40):
36| 40| 0.232263| 0.00580657| 0.03%| count = len(primes(1000000))
(call)| 40| 886.644| 22.1661| 99.97%|# 03.primes-v1.py:4 primes
37| 1| 5.96046e-06| 5.96046e-06| 0.00%| end = time.time()
38| 1| 0.000678062| 0.000678062| 0.00%| print "Benchmark duration: %r seconds" % (end-start)
39| 0| 0| 0| 0.00%|
40| 0| 0| 0| 0.00%|
41| 1| 5.79357e-05| 5.79357e-05| 0.00%|benchmark()
(call)| 1| 886.878| 886.878|100.00%|# 03.primes-v1.py:33 benchmark
我们现在可以看到更详细的细节。让我们稍微研究一下这个输出。这是这个脚本的整个输出,每一行你可以看到调用的次数、运行它所用的时间(秒)、每次调用的时间和占全局时间的比例。此外,pprofile 还为我们的输出增加了额外的行(比如 44 和 50 行,行前面写着 (call)),这是累积指标。
同样,我们可以看到有两个循环在反复调用 list.append,占用了脚本的大部分时间。
vprof
地址:https://github.com/nvdv/vprof
vprof 是一个 Python 分析器,为各种 Python 程序特点提供了丰富的交互式可视化,比如运行时间和内存使用。这是一个图形化工具,基于 Node.JS,可在网页上展示结果。
使用这个工具,你可以针对相关 Python 脚本查看下面的一项或多项内容:
CPU flame graph
代码分析(code profiling)
内存图(memory graph)
代码热图(code heatmap)
要使用这个工具,你首先需要通过 pip 安装:pip install vprof(CPython2)/ pypy -m pip install vprof(PyPy)。
在 CPython2 上,要显示代码热图(下面的第一行调用)和代码分析(下面的第二行调用):
vprof -c h 03.primes-v1.py
vprof -c p 03.primes-v1.py
在 PyPy 上,要显示代码热图(下面的第一行调用)和代码分析(下面的第二行调用):
pypy -m vprof -c h 03.primes-v1.py
pypy -m vprof -c p 03.primes-v1.py
在上面的两个例子中,你都会看到如下的代码热图:
以及如下的代码分析:
结果是以图形化的方式展示的,你可以将鼠标悬浮或点击每一行,从而查看更多信息。
同样,我们可以看到有两个循环在反复调用 list.append,占用了脚本的大部分时间。
2. 音乐剧摇滚年代有哪些金曲?
1.Any Way You Want It /I Wanna Rock
2.Can't Fight This Feeling
3.Cum On Feel The Noize
4.Don't Stop Believin'
5.Every Rose Has It's Thorn
6.Harden My Heart /Shadows Of The Night
7.Heaven/ More Than Words To Be With You
8.Here I Go Again
9.High Enough
10.Hit Me With Your Best Shot
11.I Hate Myself For Loving You
12.Heat Of The Moment
13.I Want To Know What Love Is
14.Just Like Paradise/ Nothin' But A Good Time
15.Oh Sherrie
16.Sister Christian
17.The Final Countdown
18.The Search Is Over
19.Waiting For A Girl Like You
20.Wanted Dead Or Alive
21.We Built This City /Too Much Time On My Hands
22.We're Not Gonna Take It
3. 有什么好的视频编辑软件是适合苹果电脑mac下载的呢?
如果不是专业的处理视频,那我相信iMovie已经足够满足你的需求了,再专业的软件mac下当然是Final Cut Pro莫属,当然也可以用ADOBE的PR来处理,有mac版的,特效就用苹果的Motion或者ADOBE的AE吧。
下面是软件推荐及介绍 (默认平台为PC,其它平台括号里有标注)SolveigMM Video Splitter (荐)
先说明一点,这个不是非线性编辑软件,功能单一,只有剪切视频的功能。不要跟Pr、Vegas,FCP比较,不是同类软件好么!!!优点:小巧(51MB)、简单好用(非编软件都算不上的剪辑软件能不简单好用么),学习成本可以忽略不计、视频可以无损剪辑、项目周期短(就是导出非常非常快,跟前面是因果关系)、在我试过的所有同类软件中剪辑是最精确的(其它软件只能精确到关键帧)、缺点:收费(不考虑盗版)、不能加速播放、太尼玛简单了,不能非线性编辑,不能添加后期效果(人家定位本来就跟Pr,Vegas等不一样好么,没有这个需求的话就不是缺点了)补充,SolveigMM Video Splitter 支持的格式见下图,包含了绝大多数的格式Potplayer没错这是个视频播放软件,但是可以达到题主的要求,使用方法是:播放时用播放器自带的功能(当然你要用另外的软件比如Bandicam录制也可以)录制屏幕优点:播放控制顺手、能加速播放、基本没有学习成本、由于并非像QQ影音一样是截取视频,而是录制,因此应该是能精确定位的,理论上哈,原谅我不负责任一次。可能缺点:录制时不能加速播放、视频画质有损失(参数调的好可以忽略不计)、没有后期功能
Potplayer + SolveigMM Video Splitter (荐)没错,前两个软件可以搭配使用,方法是:用PotPlayer方便的确定所需要剪辑的时间段(其实就是为了能用加速播放,因此只要是有加速播放功能的播放器就行,不一定要Potplayer),再在SolveigMM Video Splitter 中剪辑。缺点:SVS收费、稍微稍微麻烦、没有后期功能(还是那句话,没有这个需求就不是缺点)
Corel VideoStudio Pro (绘声绘影)、iMovie (MAC)、AVS Video Editor我在这再推荐一个软件吧!GoPro自带的剪辑软件,GoPro Studio。软件免费WIN/MAC平台都有,在GoPro官网可以下载世界上功能最多的摄像机
这个软件介于普通剪辑软件和专业剪辑软件之间。界面很友好很容易上手,不会剪辑的同学,它还为你提供了镜头剪辑的模版。还可以简单添加字幕,改变视频帧率,视频调色等等稍微专业一点功能。看到题主说需要精确的剪辑,在软件里控制电脑的左右方向键可以提供精确的视频的每一帧预览。还有一点很好,这个软件在你导入素材之后,可以进行粗略的第一次剪辑。然后选择你需要的视频片段,软件会自动转码。然后就可以输出到软件的编辑区。
第一步导入了转码:第二步就可以进一步编辑,添加音频和字母:软件还提供了剪辑的模版,模版还可以网上下载:第三步视频共享,可以输出MOV格式,或者共享到网站。如果有苹果电脑的朋友我还是推荐iMovie入门,入门之后就可以学习FCPX。个人认为苹果的剪辑软件比较适合入门的朋友,可视化很直观。4. cumshot什么意思?
cumshot
英音: [`kRmFOt] 美音: [`kRmFOt]
名词&v. 射精
5. 请问足球比赛里助攻是怎么算的?
助攻,是足球战术统计的一项数据。由于存在不同的数据统计机构和统计口径,对于助攻的定义并不完全一样。
下面我们以最著名的数据统计机构OPTA为例。该统计机构对于自己统计的数据有严格的定义,详情可以点击这个链接:http://optasports.com/news-area/blog-optas-event-definitions.aspx
在这个链接里说得很明白,所谓助攻(assist),就是The final pass or pass-cum-shot leading to the recipient of the ball scoring a goal.(接球者打入进球前的那最后一传或者是传射,都叫作助攻。)最后一传比较好理解,传射指的是你也搞不清楚他是想射门还是传球,反正这个球最后到了队友脚下,队友把球打进去了。
从定义可以看出,助攻这个数据也有欺骗性:比如本赛季欧冠首轮比赛中,切尔西门将库尔图瓦传给自己的右后卫扎帕科斯塔,扎帕科斯塔带球过人杀到对方半场后直接射门中鹄,结果算库尔图瓦一次助攻,也是2012年11月凯尔特人门将弗雷泽·福斯特在对巴塞罗那的比赛中助攻以来,门将在欧冠赛场的第一次助攻。可这个助攻数据,比起其它很多人的关键传球来说,刷得实在太便宜了。
顺便说一下的是,统计中还常见的词语是“创造机会(Chance created)”——所谓创造机会,通俗讲就很简单,就是导致队友射门一次的那记传球。射门进不进不管,都是创造机会。那些打进的,就是助攻。那些没有打进的,就是“关键传球(Key pass)”。所以,创造机会=助攻+关键传球。
以上是OPTA对助攻的定义。但在很多“梦幻联赛”足球游戏中,助攻还有多种繁杂的定义。比如,有些规定,射门被门将扑出或者后卫、门柱挡出,随后补射,头一个射门的球员算助攻。还有些规定,赢得导致进球的点球或任意球,算助攻一次。还有的规定,传球射门导致对手乌龙球的,也算助攻一次。但这些都算是相当另类的助攻统计,一般助攻以OPTA定义为准。【完】
6. Pro非常好用的软件有哪些?
人人都会用到的十款Mac必备软件分享,新人必备,献给大家(完全版)
威锋大神干货,转过来吧!
1. 全能解压
使用Mac以后感觉Mac自带的归档实用工具其实还算不错:能够打开的格式很多,并且打开速度较快,解压稳定性强。可是,在很多复杂的应用场景下,找一个文章文档,需要把很多文件一起解压,时间浪费的不多,但极容易让人感到厌烦。之后推荐的the Unarchiver,在我感觉和归档类似,不能算特别出彩,直到看到全能解压。软件本身是App Store的一款免费软件,但是软件的功能确实要比很多付费软件还要强大。在单纯的解压方面,软件和the Unarchiver一样,都可以无乱码的快速解压;在扩展功能上,软件更胜一筹:能够在不解压的情况下,对包内文件进行预览,打开,部分解压缩和选择解压路径等等。在工作和生活中来说,全能解压相较于其他两款软件,确实是要实用的太多了,这也是我第一个把它放上来的主要缘故。
2. 每日英语听力
这款软件也是我的最爱,在之前准备ya si kao shi 的时候,是这款软件帮助我大大提升了自己的英语能力。软件有几个优点,让我觉得不能不说:颜值高。软件的整个界面做的都非常的清爽干净,菜单栏,工具栏设置合理,一目了然,让人能够很快上手,而不是像很多软件那样,用一个功能都需要找半天。语料全。从幼儿园到native speaker,不论是什么英语水平,都能在这里找到合适的语料,尤其是考试语料,包括了王陆的语料库,雅思和托福,四六级考试的模拟听力,都是很难找到的素材。功能强。不仅绝大部分语料都有中文,能够让大家听之后知其所以然;其内部集成的播放器可以调整倍速播放,可以减慢速度帮助跟读,也可以倍速锻炼语感。这样一款英语学习软件,不仅仅是需要考试的小孩子需要,即便步入职场,希望潜移默化的锻炼自己的听力,也完全可以考虑这一款软件。
3. The Brain思维导图
在我们步入社会之后会经常使用,往往用来帮助我们理清项目的逻辑结构,进行任务安排和梳理。然而到我们的实际生活中,或者是多项目并行的情况下,其实思维导图就会有所局限了。究其原因主要是因为现存思维导图的树状结构和我们的思考模式不同。在我们提到“父亲”这个词的时候,你最先开始想到的会是父亲的特性,比如他的身份,长相,脾性等等,而不是他的从属关系。树状结构强调的是元素间的从属关系,而人类在思考的时候,会是一个发散的结构,这就是为什么思维导图在复杂情况下,用处不大的主要原因。The Brain是一款思维导图,并且是真正按照人类思维模式进行设计的。在使用这个思维导图的时候,你会有先将事物的性质等填入,之后将相同性质的事物进行关联。在开始使用的时候感觉很困难,毕竟要把事情事无巨细的进行记录,每天都需要消耗10分钟左右,但一段时间以后,你会有惊喜的收获:The Brain相当于复制了你的大脑和思维,并且它永远不会遗忘。从这点来说,The Brain确实非常强力。
4. 印象笔记
这款软件似乎已经被大家推荐烂了,但是究竟为什么要用它,它到底有什么特别之处,很少有人能给出一个准确的答案。现在的市场上,类似的笔记类软件,除了EverNote,Microsoft的OneNote,还有各种各样的云笔记,其中不乏中国大厂的产品,然而私心里还是更推荐最开始的两款。各种原因不多阐述,而且这两款软件不论是日常随笔还是知识纪录都是够用的了。印象笔记这类软件,使用主要是为了两个目的:资料整理和知识纪录;笔记记录和知识体系整理。前者印象笔记更优,后者OneNote领先。印象笔记是一种资料库的感觉,它的内部没有恨规整的目录结构,但是它的搜索引擎做的非常棒:即便是你在图片中写的字,在搜索的时候也能够搜索出来。这就好比我们现在用的百度,Google等搜索引擎,在创建自我的知识体系,对自己的知识进行整理的时候是很有用的。另一方面,印象笔记给人更高的自由度,有一种真实的记笔记的感觉,也是需要表扬的。而OneNote更给人一种模块感,所有的内容都是一个个的大板块页,下来再有小板块分级。所以如果你是希望分门别类按章按节的写点什么,那OneNote会更适合。顺嘴忘了说,在同步方面,OneNote明显更弱,如果你需要进行频繁的多设备记录,或是和一个项目组共同使用笔记,那还是尽量考虑印象笔记吧。
5. 1Password
如今大家的生活越来越电子化,大到投资理财,小到日常购物,都离不开网络。日常需要使用的帐号,大大小小能数出十多个,密码的管理问题也一直是我们的“心腹大患“。虽然每个人都知道,使用随机生成的密码,复杂度较高的密码和定期更换密码能够让我们的账户安全得到提升,但是,管理起来确实容易秒崩记串不解释。其实大多数使用Mac 的小伙伴,都对Mac 的钥匙串赞不绝口,轻量级的钥匙串能够记忆你的每一个密码,并在你输入新密码时对应更新,在使用体验上是非常方便的。但是钥匙串拥有一定的局限性:无法自动生成随机密码,记录的密码全部来自于你的输入;只能管理线上账户,对于你的银行密码,手机账户等无能为力。如果你希望自动生成随机密码,并对线下的账户进行管理,那你可能需要第三方软件的支持。1Password是我比较推荐的一款密码管理类软件,上述说的功能都包括:密码自动生成,线下账户密码管理,密码保存同步等等,可以说是钥匙串的加强版。整体界面设计的也非常不错,简洁不简陋,是比较适合像我一样的健忘症同志的。但是,1Password的使用也是存在一些问题的。首先,1Password的价格并不便宜,相对于自带的钥匙串,要多花几百大洋究竟值不值,有时候仁者见仁智者见智。其次,1Password之前一直宣称密码的安全性是非常高的,然而之前也爆出过安全漏洞。虽然有那么多让人纠结的点,1Password放在这里推荐也是有几个特殊的原因的。第一,名气和口碑。放眼望去,几乎在打架推荐密码管理软件的时候,1Password总是有一席之地,口碑和使用体验也很不错。其次,虽然有安全漏洞,但是几乎所有的密码管理软件,加密密码的方式都是类似的,在这次爆出安全漏洞后进行自查,1Password的安全性可能不减反增。最后,软件现在转变了销售策略,小伙伴们能够先下载使用,3个月(我应该没记错)的试用期过后再决定是否购买。P.S.我知道打了很多字了,但是还是说一下,钥匙串和1Password是可以在多平台同步的。当然,钥匙串只能在苹果的设备,通过Apple ID进行同步,而1Password则可以在win(额外付费),苹果设备间通过帐号进行同步。
6. Dr. Cleaner Pro
从开始用Mac 的第一天起,各种有关到底Mac用不用清理类软件的观点和讨论就如雨点般向我打来,而且最崩溃的是,两方都有理有据,还有数据支撑,有一种被亲爸妈一人一只手使劲拉的碎裂感,直到遇到了Pro,才帮我解决了这个问题。Pro确实拥有非常不错的内存清理功能,但是我更希望提及的是它对文件和软件的管理。对文件来说,Pro能帮助我们找到Mac内你不需要的文件,包括了重复文件,大文件,垃圾文件等等。这一点我觉得是非常实用的。对于曾经的一个 糙男,如果不是磁盘爆炸,我是基本不会去清理下载的电影,图片之类的文件的,但是,通过Google,迅雷,wechat等等渠道下载的文件往往会被默认保存到不同的地方去(是的,那时候就那么懒。。),在清理的时候往往找不到文件去了哪儿。又或者在准备论文和文档材料的时候,各个地方复制粘贴,做完一个论文才发现Mac里有了那么多一样内容的文件。有心大手一挥全部删除,但又担心忘记留备份,只能苦逼的一个一个文件打开查看。所以我发现Pro能够直接扫描重复文件,大文件的时候就毫不犹豫的下载了。对软件的管理,是我一定要给十个赞的神奇功能。Mac内的App Store虽然软件齐全,但是有更多的软件是在App Store外部进行销售的,而这一类的软件有一个共同的优点:常规方式卸载不掉。也就是说,你不能够简简单单拖拽删除,或者看它不爽的时候长时间选中和它说再见。它们大多需要找到原本的文件包,通过内部的卸载软件进行卸载。而在拥有了Pro之后,你能够直接通过Pro,直观的查看到软件和相关文件的大小,并且彻彻底底的将软件从你的Mac 上卸载掉。至于本身携带的内存清理功能,反而体会不到太大的存在感——不是功能不好,而是Pro对内存的清理,基本上是自发的,不需要更多的操作。新Mac对这个功能不是特别看重,但像我这样的老爷机,确实在Pro 的帮助下有了更好的使用体验,直观的感受是“office全家福”死的次数越来越少了。Pro是一款付费软件,价格大概是在100以内,和一些同类软件相比价格也是比较实惠的了,而功能非常实用和可靠,在App Store 内的排名也非常高,算是推荐的主要原因了。
7. Movist
Mac上的QuickTime堪称神器,不仅能够进行音视频的播放,还能够用来录屏,录音等等。但是单丛播放这个角度上来看,感觉QuickTime有一些地方不是很人性化。比如,QuickTime没有视频列表,在播放完一个视频之后,你只能从新返回选择播放;部分格式的视频,无法打开或是崩溃。最让人不爽的是,想要快进的时候,通过方向键的向左或向右无法拉动进度,只能手动拉动进度条,真的很不舒服。Movist相比较来说,单单在视频播放的角度做的要出彩的多。除了解决以上几个强迫症不能忍问题外,Movist还有很多的高级设置,包括导入字幕,视轨声轨,通过触摸板上下滑调节音量等等,在观看体验上是很不错的。软件同样收费,价格在¥30左右。去年自己做了一个小的表格,看了一下现在主流的几款视频播放器的具体功能,并且做了一个简单的比较,就放图说话吧。(PS:不是很喜欢爱奇艺,优酷等客户端带的播放器,有广告,而且经常会崩溃,尤其优酷)
8. 泼辣修图
修图已经不仅仅是小撮少女的专利了,现在从男到女,从老到少,修图已经成为了全民必备技能。PS虽说是修图神器,功能全面,但是平常图片不需要精修,花重金购买PS总觉得杀鸡用了牛刀,操作也比较复杂;美图秀秀虽然也不错,但是没有客户端,网页版本的使用有局限性,而且略烦。泼辣修图拥有如下几个优点,让我觉得不得不推荐给大家:第一,免费且功能全面。这里说的是精简版,但功能绝对不精简,滤镜,色调,暗角曲线,光效,质感还有N多高级功能,比肩很多收费软件。虽然看起来功能不算太多,但是日常的修图,已经完全够用了。第二,界面友好。很多修图软件,界面就不让我信任你——你想帮我把照片变得更美一点,可连你的界面都让我不自信。泼辣修图,全中文操作,界面简洁美观,享受美,能够从打开软件开始。第三,使用体验高。不仅每一个按钮都清晰明了容易使用,更重要的是,第一次使用的时候有教程,这点超贴心有木有!每次使用新功能都会有教程!手残党和摸索不成党的绝对福利!
9. 幕布
幕布是一款专业的大纲记录软件。在你完成一件事情之前,你能够对事情进行大致的了解,之后对每一步和预期将要遇到的困难进行罗列和整理,从而达到在面对困难时有所准备,从容应对的效果。
推荐幕布有三个理由:简单的操作,良好的使用体验和强大的扩展。幕布的操作和传统的软件完全不一样,大纲的写作方式完全和常见的文本编辑方式一致,绝大多数情况下,你可以在没有鼠标的情况下使用幕布。你完全不需要在鼠标和键盘间来回切换,为内容添加优先级和逻辑关系——是的,这些内容都可以使用键盘来完成。其次,对于这样开拓性的设计,很多人都会担心上手困难。在幕布,第一次打开软件的时候会有非常详细的教程说明,小白也能够轻松上手。最后,值得一提的是,软件还能够快速导出思维导图,支持富文本和文件插入,支持文件和文件夹系统等等。幕布充分考虑了人「懒」的特性,简化了大纲的操作和反馈机制,让大家更愿意进行大纲的记录和写作,在事情开始前和结束后都能有很好的反馈,从而提升效率。10. ControlPlane
绝对的小众软件,功能虽小但很贴心。虽然Safari和Google Chrome在功能和性能上很难分出优劣,但是不可否认的是,Safari的耗电量要相对更低,而Chrome的扩展则更多,功能也更加的丰富。在接通电源的时候,我们可以使用Chrome,来享受更多的扩展和功能;而在断电情况下,Safari明显更受欢迎。但是手动的方式来调整浏览器是一件比较繁琐的事情,CP就是一款帮助大家完成浏览器切换自动化的软件。在下载安装软件之后,打开我们会看到内部有通用(General)、情境(Contexts)、迹象(Evidence Sources)、规则(Rules)、动作(Actions)、高级(Advanced)等等选项卡,在使用的时候,我们需要设定规则,在特定的迹象出现的时候,触发对应的规则;软件将根据电脑到底处于什么样的情境,然后采用对应的动作。软件的功能非常丰富,不仅仅是根据电源状况设置默认浏览器,你还能够根据蓝牙状态,外置存储,以至于IP地址,地理位置,光线强弱等等都可以作为情境出现的条件;可以执行的动作还有打开文件/应用、加载/推出设备和开关WIFI之类的。
**********补充软件*************
补充:安全防护问题本来说好了十款软件的,但是上周五开始爆发的bitcoin勒索事件,让我觉得必须要提一嘴Mac安全防护的事情。先说下整个事件,防止有小伙伴一头雾水。从上周五开始,全世界范围内陆续有Windows用户中电脑病毒,电脑内所有文件被加密,必须要给黑客进行bitcoin汇款才能够打开(虽然貌似汇了钱也没有用),平均一个bitcoin价格大概在$1690左右,而每次勒索1~3个bitcoin左右。此次中招的用户大多没有及时更新系统漏洞,尤以学校和医院为重。大批毕设论文写好的学生,论文被锁定无法打开,医院系统瘫痪引发众怒也得到了大家更多的关注。这虽然是Windows下的事,而Mac的安全性能也更优秀,但Mac的使用安全远非高枕无忧:Mac的安全漏洞每年都会发现几个,而针对Mac电脑的相关病毒也有一些,只是因为Mac的使用占比仅在10%左右,所以目前还没有被针对攻击。日前,第二次病毒潮将汹涌而来,波及范围更广,病毒能力更强,即便波及不到Mac用户,我觉得大家也应该了解一些关于Mac的安全防护的点。第一,不要在App Store外下软件,尤其是一些你听都没听说过的平台。App Store每一个上架软件,从上架申请开始就需要进行审核,对软件的内容,更新,功能都有很高的要求。也许它们各自都有槽点,但说有能够在Apple的严苛审核下还能蒙混过关的病毒,概率是真的不大。所以,只要不在App Store外随意下载软件,中毒概率其实就会小很多。第二,密码请具有多样性。很多人为了方便把密码设置为自己的生日,或是所有地方的密码一个样,老实说是很危险的一件事。密码和用户名在一些安全防护等级较差的网站,是会直接加密后放在网址里的,这些加密并不算复杂,而现在手机和QQ基本上能当作我们的“网络shen fen zheng ”来用了,你的用户名也就很难保密,如果连密码也一个样,那一旦破译了一个,就有危险全军覆没。使用随机数密码,通过软件或钥匙串记录,能最大限度的保证账号安全。第三,三方软件帮助。电脑病毒分成很多种,简单可以认为有三种。第一种,类似于bitcoin事件,在你的电脑内限制你的访问和操作,达到勒索目的;第二种,破坏xing bing 毒,对你的文件进行破坏,或强行进行控制操作;第三种,不吵不闹乖乖呆在你的电脑,负责记录和收集你的数据发送给黑客。前两种症状很明显,但第三种有时候完全觉察不出来,用一些好的三方软件定期扫描是很有必要的。我自己现在用的是趋势安全大师,扫描免费,杀毒收费,不像很多软件那样,想扫描都要买软件,买下来一年杀不了一个病毒,白白浪费钱,病毒库实时更新,技术支持也很快速。经验之谈:不要用Windows 下你听的最多的三款软件,尤其是免费的,你真的会崩的。。。(其他的杀毒软件貌似都在Store外销售,只有这款进了App Store的排行榜,如果自己有常用的也没关系)总之,在这个Windows系统男默女泪打病毒的关键时期,希望麦友们看戏别忘自身,全都能有一个安全稳定的Mac使用环境。
本站涵盖的内容、图片、视频等数据系网络收集,部分未能与原作者取得联系。若涉及版权问题,请联系我们删除!联系邮箱:ynstorm@foxmail.com 谢谢支持!
1. cumshot,如何提高Python代码的性能?
Python Files 博客发布了几篇主题为「Hunting Performance in Python Code」的系列文章,对提升 Python 代码的性能的方法进行了介绍。在其中的每一篇文章中,作者都会介绍几种可用于 Python 代码的工具和分析器,以及它们可以如何帮助你更好地在前端(Python 脚本)和/或后端(Python 解释器)中找到瓶颈。代码地址:https://github.com/apatrascu/hunting-python-performance
目录
一、环境设置
二、内存分析
三、CPU 分析——Python 脚本
四、CPU 分析——Python 解释器(略)
一、环境设置
设置
在深入到基准测试和性能分析之前,首先我们需要一个合适的环境。这意味着我们需要为这项任务配置我们的机器和操作系统。
我的机器的规格如下:
处理器:Intel(R) Xeon(R) CPU E5-2699 v3 @ 2.30GHz
内存:32GB
操作系统:Ubuntu 16.04 LTS
Kernel:4.4.0-75-generic
我们的目标是得到可复现的结果,因此要确保我们的数据不会受到其它后台进程、操作系统配置或任何其它硬件性能提升技术的影响。
让我们首先从配置用于性能分析的机器开始。
硬件功能
首先,禁用所有硬件性能功能,也就是说要禁用 Intel Turbo Boost 和 Hyper Threading from BIOS/UEFI。
正如其官方网页上说的那样,Turbo Boost 是「一种在处理器内核运行,并可以在低于功耗、电流和温度规格限制的情况下允许它们以高于额定频率的速度运行的技术。」此外,Hyper Threading 是「一种可以更高效地利用处理器资源的技术,能使每个内核都能多线程运行。」
这都是值得我们花钱购买的好东西。那为什么要在性能分析/基准测试中禁用它们呢?因为使用这些技术会让我们无法得到可靠的和可复现的结果。这会让运行过程发生变化。让我们看个小例子 primes.py,代码故意写得很糟糕。
import time
import statistics
def primes(n):
if n==2:
return [2]
elif n<2:
return []
s=range(3,n+1,2)
mroot = n ** 0.5
half=(n+1)/2-1
i=0
m=3
while m <= mroot:
if s[i]:
j=(m*m-3)/2
s[j]=0
while j<half:
s[j]=0
j+=m
i=i+1
m=2*i+3
return [2]+[x for x in s if x]
def benchmark():
results = []
gstart = time.time()
for _ in xrange(5):
start = time.time()
count = len(primes(1000000))
end = time.time()
results.append(end-start)
gend = time.time()
mean = statistics.mean(results)
stdev = statistics.stdev(results)
perc = (stdev * 100)/ mean
print "Benchmark duration: %r seconds" % (gend-gstart)
print "Mean duration: %r seconds" % mean
print "Standard deviation: %r (%r %%)" % (stdev, perc)
benchmark()
这段代码可在 GitHub 上查看:https://github.com/apatrascu/hunting-python-performance/blob/master/01.primes.py。你需要运行以下命令安装一个依赖包:
pip install statistics
让我们在一个启用了 Turbo Boost 和 Hyper Threading 的系统中运行它:
python primes.py
Benchmark duration: 1.0644240379333496 seconds
Mean duration: 0.2128755569458008 seconds
Standard deviation: 0.032928838418120374 (15.468585914964498 %)
现在禁用该系统的睿频加速(Turbo Boost)和超线程(Hyper Threading),然后再次运行这段代码:
python primes.py
Benchmark duration: 1.2374498844146729 seconds
Mean duration: 0.12374367713928222 seconds
Standard deviation: 0.000684464852339824 (0.553131172568 %)
看看第一个案例的标准差为 15%。这是一个很大的值!假设我们的优化只能带来 6% 的加速,那我们怎么能将运行过程中的变化(run to run variation)和你的实现的差异区分开?
相对而言,在第二个例子中,标准差减少到了大约 0.6%,我们的新优化方案效果清晰可见。
CPU 节能
禁用所有的 CPU 节能设置,并使用固定的 CPU 频率。这可以通过在 Linux 功率调节器(power governor)中将 intel_pstate 改成 acpi_cpufreq 而实现。
intel_pstate 驱动使用英特尔内核(Sandy Bridge 或更新)处理器的内部调节器实现了一个缩放驱动。acpi_cpufreq 使用了 ACPI Processor Performance States。
下面让我们先来检查一下:
$ cpupower frequency-info
analyzing CPU 0:
driver: intel_pstate
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 0.97 ms.
hardware limits: 1.20 GHz - 3.60 GHz
available cpufreq governors: performance, powersave
current policy: frequency should be within 1.20 GHz and 3.60 GHz.
The governor "powersave" may decide which speed to use
within this range.
current CPU frequency is 1.20 GHz.
boost state support:
Supported: yes
Active: yes
可以看到这里所使用的调节器被设置成了节能模式,而 CPU 的频率范围在 1.20 GHz 到 3.60 GHz 之间。这个设置对日常应用来说是很不错的,但却会影响到基准测试的结果。
那么应该给调节器设置什么值呢?如果我们浏览一下文档,我们可以看到我们可以使用以下设置:
高性能(performance):以最大频率运行 CPU
节能(powersave):以最小频率运行 CPU
自定义(userspace):按用户指定的频率运行 CPU
按需(ondemand):根据当前负载动态调节频率。可能跳至最高频率,空闲时又会降低
保守(conservative):根据当前负载动态调节频率。相比于按需模式,其频率调节更加渐进
我们要使用性能调节器(performance governor),并将频率设置成 CPU 支持的最大频率。如下所示:
$ cpupower frequency-info
analyzing CPU 0:
driver: acpi-cpufreq
CPUs which run at the same hardware frequency: 0
CPUs which need to have their frequency coordinated by software: 0
maximum transition latency: 10.0 us.
hardware limits: 1.20 GHz - 2.30 GHz
available frequency steps: 2.30 GHz, 2.20 GHz, 2.10 GHz, 2.00 GHz, 1.90 GHz, 1.80 GHz, 1.70 GHz, 1.60 GHz, 1.50 GHz, 1.40 GHz, 1.30 GHz, 1.20 GHz
available cpufreq governors: conservative, ondemand, userspace, powersave, performance
current policy: frequency should be within 2.30 GHz and 2.30 GHz.
The governor "performance" may decide which speed to use
within this range.
current CPU frequency is 2.30 GHz.
cpufreq stats: 2.30 GHz:100.00%, 2.20 GHz:0.00%, 2.10 GHz:0.00%, 2.00 GHz:0.00%, 1.90 GHz:0.00%, 1.80 GHz:0.00%, 1.70 GHz:0.00%, 1.60 GHz:0.00%, 1.50 GHz:0.00%, 1.40 GHz:0.00%, 1.30 GHz:0.00%, 1.20 GHz:0.00% (174)
boost state support:
Supported: no
Active: no
现在你已经使用性能调节器将频率设置成了固定的 2.3 GHz。这是最大的可设置的值,没有睿频加速(Turbo Boost),它可以被用在 Xeon E5-2699 v3 上。
要完成设置,请使用管理员权限运行以下命令:
cpupower frequency-set -g performance
cpupower frequency-set --min 2300000 --max 2300000
如果你没有 cpupower,可使用以下命令安装:
sudo apt-get install linux-tools-common linux-header-`uname -r` -y
功率调节器对 CPU 的工作方式有很大的影响。该调节器的默认设置是自动调节频率以减少功耗。我们不想要这样的设置,所以从 GRUB 中禁用它。只需要编辑 /boot/grub/grub.cfg(但是如果你在 kernel 升级上很小心,那么这将会消失)或在 /etc/grub.d/40_custom 中创建一个新的 kernel 入口。我们的 boot 行中必须包含这个 flag: intel_pstate=disable,如下所示:
linux /boot/vmlinuz-4.4.0-78-generic.efi.signed root=UUID=86097ec1-3fa4-4d00-97c7-3bf91787be83 ro intel_pstate=disable quiet splash $vt_handoff
ASLR(地址空间配置随机发生器)
这个设置是有争议的,参见 Victor Stinner 的博客:https://haypo.github.io/journey-to-stable-benchmark-average.html。当我首次建议在基准测试时禁用 ASLR 时,那是为了进一步提升对那时在 CPython 中存在的 Profile Guided Optimizations 的支持。
我为什么要说这个呢?因为在上面给出的特定硬件上,禁用 ASLR 可以将运行之间的标准差降低至 0.4%。
另一方面,根据在我的个人计算机(Intel Core i7 4710MQ)上的测试,禁用 ASLR 会导致 Victor 所提到的同样的问题。在更小的 CPU(比如 Intel Atom)上的测试会带来甚至更大的运行间标准差。
因为这似乎并不是普遍适用的真理,而且很大程度上依赖于硬件/软件配置,所以对于这个设置,我在启用后测量一次,再禁用后测量一次,之后再进行比较。
在我的机器上,我通过在 /etc/sysctl.conf. 中加入以下命令禁用了 ASLR。使用 sudo sysctl -p 进行应用。
kernel.randomize_va_space = 0
如果你想在运行时禁用它:
sudo bash -c 'echo 0 >| /proc/sys/kernel/randomize_va_space'
如果你想重新启用:
sudo bash -c 'echo 2 >| /proc/sys/kernel/randomize_va_space'
二、内存分析
在这一节,我将介绍一些有助于我们解决 Python 中(尤其是使用 PyPy 时)的内存消耗难题的工具。
我们为什么要关心这个问题?为什么我们不仅仅就关心性能?这些问题的答案相当复杂,但我会总结出来。
PyPy 是一个可选的 Python 解释器,其相对于 CPython 有一些巨大的优势:速度(通过其 Just in Time 编译器)、兼容性(几乎可以替代 CPython)和并发性(使用 stackless 和 greenlets)。
PyPy 的一个缺点是因为其 JIT 和垃圾一样的回收站实现,它通常会使用比 CPython 更多的内存。但是在某些案例中,其的内存消耗会比 CPython 少。
下面我们来看看你可以如何测量你的应用使用了多少内存。
诊断内存使用
memory_profiler
memory_profiler 是一个可用来测量解释器运行一个负载时的内存用量的库。你可以通过 pip 安装它:
pip install memory_profiler
另外还要安装 psutil 依赖包:
pip install psutil
这个工具的优点是它会在一个 Python 脚本中一行行地显示内存消耗。这可以让我们找到脚本中可以被我们重写的位置。但这种分析有一个缺点。你的代码的运行速度比一般脚本慢 10 到 20 倍。
怎么使用它?你只需要在你需要测量的函数上直接加上 @profile() 即可。
让我们看看实际怎么操作!我们将使用之前用过的素材脚本作为模型,但做了一点修改,移除了统计部分。代码也可在 GitHub 查看:https://github.com/apatrascu/hunting-python-performance/blob/master/02.primes-v1.py
from memory_profiler import profile
@profile(precision=6)
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = range(3, n + 1, 2)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
return [2] + [x for x in s if x]
len(primes(100000))
开始测量时,使用以下 PyPy 命令:
pypy -m memory_profiler 02.primes-v3.py
或者直接在脚本中导入 memory_profiler:
pypy -m memory_profiler 02.primes-v3.py
在执行完这行代码之后,我们可以看到 PyPy 得到这样的结果:
Line # Mem usage Increment Line Contents
================================================
54 35.312500 MiB 0.000000 MiB @profile(precision=6)
55 def primes(n):
56 35.351562 MiB 0.039062 MiB if n == 2:
57 return [2]
58 35.355469 MiB 0.003906 MiB elif n < 2:
59 return []
60 35.355469 MiB 0.000000 MiB s = []
61 59.515625 MiB 24.160156 MiB for i in range(3, n+1):
62 59.515625 MiB 0.000000 MiB if i % 2 != 0:
63 59.515625 MiB 0.000000 MiB s.append(i)
64 59.546875 MiB 0.031250 MiB mroot = n ** 0.5
65 59.550781 MiB 0.003906 MiB half = (n + 1) / 2 - 1
66 59.550781 MiB 0.000000 MiB i = 0
67 59.550781 MiB 0.000000 MiB m = 3
68 59.554688 MiB 0.003906 MiB while m <= mroot:
69 59.554688 MiB 0.000000 MiB if s[i]:
70 59.554688 MiB 0.000000 MiB j = (m * m - 3) / 2
71 59.554688 MiB 0.000000 MiB s[j] = 0
72 59.554688 MiB 0.000000 MiB while j < half:
73 59.554688 MiB 0.000000 MiB s[j] = 0
74 59.554688 MiB 0.000000 MiB j += m
75 59.554688 MiB 0.000000 MiB i = i + 1
76 59.554688 MiB 0.000000 MiB m = 2 * i + 3
77 59.554688 MiB 0.000000 MiB l = [2]
78 59.679688 MiB 0.125000 MiB for x in s:
79 59.679688 MiB 0.000000 MiB if x:
80 59.679688 MiB 0.000000 MiB l.append(x)
81 59.683594 MiB 0.003906 MiB return l
我们可以看到这个脚本使用了 24.371094 MiB 的 RAM。让我们简单分析一下。我们看到其中大多数都用在了数值数组的构建中。它排除了偶数数值,保留了所有其它数值。
我们可以通过调用 range 函数而对其进行一点改进,其使用一个增量参数。在这个案例中,该脚本看起来像是这样:
from memory_profiler import profile
@profile(precision=6)
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = range(3, n + 1, 2)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
l = [2]
for x in s:
if x:
l.append(x)
return l
len(primes(100000))
如果我们再次测量,我们可以得到以下结果:
Line # Mem usage Increment Line Contents
================================================
27 35.343750 MiB 0.000000 MiB @profile(precision=6)
28 def primes(n):
29 35.382812 MiB 0.039062 MiB if n == 2:
30 return [2]
31 35.382812 MiB 0.000000 MiB elif n < 2:
32 return []
33 35.386719 MiB 0.003906 MiB s = range(3, n + 1, 2)
34 35.417969 MiB 0.031250 MiB mroot = n ** 0.5
35 35.417969 MiB 0.000000 MiB half = (n + 1) / 2 - 1
36 35.417969 MiB 0.000000 MiB i = 0
37 35.421875 MiB 0.003906 MiB m = 3
38 58.019531 MiB 22.597656 MiB while m <= mroot:
39 58.019531 MiB 0.000000 MiB if s[i]:
40 58.019531 MiB 0.000000 MiB j = (m * m - 3) / 2
41 58.019531 MiB 0.000000 MiB s[j] = 0
42 58.019531 MiB 0.000000 MiB while j < half:
43 58.019531 MiB 0.000000 MiB s[j] = 0
44 58.019531 MiB 0.000000 MiB j += m
45 58.019531 MiB 0.000000 MiB i = i + 1
46 58.019531 MiB 0.000000 MiB m = 2 * i + 3
47 58.019531 MiB 0.000000 MiB l = [2]
48 58.089844 MiB 0.070312 MiB for x in s:
49 58.089844 MiB 0.000000 MiB if x:
50 58.089844 MiB 0.000000 MiB l.append(x)
51 58.093750 MiB 0.003906 MiB return l
很好,现在我们的内存消耗下降到了 22.75 MiB。使用列表解析(list comprehension),我们还可以将消耗再降低一点。
from memory_profiler import profile
@profile(precision=6)
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = range(3, n + 1, 2)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
return [2] + [x for x in s if x]
len(primes(100000))
再次测量:
Line # Mem usage Increment Line Contents
================================================
4 35.425781 MiB 0.000000 MiB @profile(precision=6)
5 def primes(n):
6 35.464844 MiB 0.039062 MiB if n == 2:
7 return [2]
8 35.464844 MiB 0.000000 MiB elif n < 2:
9 return []
10 35.464844 MiB 0.000000 MiB s = range(3, n + 1, 2)
11 35.500000 MiB 0.035156 MiB mroot = n ** 0.5
12 35.500000 MiB 0.000000 MiB half = (n + 1) / 2 - 1
13 35.500000 MiB 0.000000 MiB i = 0
14 35.500000 MiB 0.000000 MiB m = 3
15 57.683594 MiB 22.183594 MiB while m <= mroot:
16 57.683594 MiB 0.000000 MiB if s[i]:
17 57.683594 MiB 0.000000 MiB j = (m * m - 3) / 2
18 57.683594 MiB 0.000000 MiB s[j] = 0
19 57.683594 MiB 0.000000 MiB while j < half:
20 57.683594 MiB 0.000000 MiB s[j] = 0
21 57.683594 MiB 0.000000 MiB j += m
22 57.683594 MiB 0.000000 MiB i = i + 1
23 57.683594 MiB 0.000000 MiB m = 2 * i + 3
24 57.847656 MiB 0.164062 MiB return [2] + [x for x in s if x]
我们最后的脚本仅消耗 22.421875 MiB。相比于第一个版本,差不多下降了 10%。
三、CPU 分析——Python 脚本
在这一节,我将介绍一些有助于我们解决 Python 中的分析 CPU 使用的难题的工具。
CPU 性能分析(profiling)的意思是通过分析 CPU 执行代码的方式来分析这些代码的性能。也就是说要找到我们代码中的热点(hot spot),然后看我们可以怎么处理它们。
接下来我们会看看你可以如何追踪你的 Python 脚本的 CPU 使用。我们将关注以下分析器(profiler):
* cProfile
* line_profiler
* pprofile
* vprof
测量 CPU 使用
import time
def primes(n):
if n == 2:
return [2]
elif n < 2:
return []
s = []
for i in range(3, n+1):
if i % 2 != 0:
s.append(i)
mroot = n ** 0.5
half = (n + 1) / 2 - 1
i = 0
m = 3
while m <= mroot:
if s[i]:
j = (m * m - 3) / 2
s[j] = 0
while j < half:
s[j] = 0
j += m
i = i + 1
m = 2 * i + 3
l = [2]
for x in s:
if x:
l.append(x)
return l
def benchmark():
start = time.time()
for _ in xrange(40):
count = len(primes(1000000))
end = time.time()
print "Benchmark duration: %r seconds" % (end-start)
benchmark()
这一节我将使用与前一节基本一样的脚本,你也可以在 GitHub 上查看:https://gist.github.com/apatrascu/8524679175de08a54a95e22001a31d3b
另外,记住在 PyPy2 上,你需要使用一个支持它的 pip 版本:
pypy -m ensure pip
其它东西可以通过以下指令安装:
pypy -m pip install
cProfile
在 CPU 性能分析上最常用的一个工具是 cProfile,主要是因为它内置于 CPython2 和 PyPy2 中。这是一个确定性的分析器,也就是说它会在运行我们的负载时收集一系列统计数据,比如代码各个部分的执行次数或执行时间。此外,相比于其它内置的分析器(profile 或 hotshot),cProfile 对系统的开销更少。
当使用 CPython2 时,其使用方法是相当简单的:
python -m cProfile 03.primes-v1.py
如果你使用的是 PyPy2:
pypy -m cProfile 03.primes-v1.py
其输出如下:
Benchmark duration: 30.11158514022827 seconds
23139965 function calls in 30.112 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 30.112 30.112 03.primes.py:1(<module>)
40 19.760 0.494 29.896 0.747 03.primes.py:3(primes)
1 0.216 0.216 30.112 30.112 03.primes.py:31(benchmark)
40 0.000 0.000 0.000 0.000 {len}
23139840 6.683 0.000 6.683 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
40 3.453 0.086 3.453 0.086 {range}
2 0.000 0.000 0.000 0.000 {time.time}
即使是这样的文本输出,我们也可以直接看到我们脚本的大多数时间都在调用 list.append 方法。
如果我们使用 gprof2dot,我们可以用图形化的方式来查看 cProfile 的输出。要使用这个工具,我们首先必须安装 graphviz。在 Ubuntu 上,可以使用以下命令:
apt-get install graphviz
pip install gprof2dot
再次运行我们的脚本:
python -m cProfile -o output.pstats 03.primes-v1.py
gprof2dot -f pstats output.pstats | dot -Tpng -o output.png
然后我们会得到下面的 output.png 文件:
这样看起来就轻松多了。让我们仔细看看它输出了什么。你可以看到来自你的脚本的一个函数调用图(callgraph)。在每个方框中,你可以一行一行地看到:
第一行:Python 文件名、行数和方法名
第二行:这个方框所用的时间占全局时间的比例
第三行:括号中是该方法本身所用时间占全局时间的比例
第四行:调用次数
比如说,在从上到下第三个红色框中,方法 primes 占用了 98.28% 的时间,65.44% 的时间是在该方法之中做什么事情,它被调用了 40 次。剩下的时间被用在了 Python 的 list.append(22.33%)和 range(11.51%)方法中。
这是一个简单的脚本,所以我们只需要重写我们的脚本,让它不用使用那么多 append,结果如下:
import time
def primes(n):
if n==2:
return [2]
elif n<2:
return []
s=range(3,n+1,2)
mroot = n ** 0.5
half=(n+1)/2-1
i=0
m=3
while m <= mroot:
if s[i]:
j=(m*m-3)/2
s[j]=0
while j<half:
s[j]=0
j+=m
i=i+1
m=2*i+3
return [2]+[x for x in s if x]
def benchmark():
start = time.time()
for _ in xrange(40):
count = len(primes(1000000))
end = time.time()
print "Benchmark duration: %r seconds" % (end-start)
benchmark()
如果我们在此之前和之后使用 CPython2 测量脚本的时间:
python 03.primes-v1.py
Benchmark duration: 15.768115043640137 seconds
python 03.primes-v2.py
Benchmark duration: 6.56312108039856 seconds
用 PyPy2 测量:
pypy 03.primes-v1.py
Benchmark duration: 1.4009230136871338 seconds
pypy 03.primes-v2.py
Benchmark duration: 0.4542720317840576 seconds
我们在 CPython2 上得到了 2.4 倍的提升,在 PyPy2 上得到了 3.1 倍的提升。很不错,其 cProfile 调用图为:
你也可以以程序的方式查看 cProfile:
import cProfile
pr = cProfile.Profile()
pr.enable()
function_to_measure()
pr.disable()
pr.print_stats(sort='time')
这在一些场景中很有用,比如多进程性能测量。更多详情请参阅:https://docs.python.org/2/library/profile.html#module-cProfile
line_profiler
这个分析器可以提供逐行水平的负载信息。这是通过 C 语言用 Cython 实现的,与 cProfile 相比计算开销更少。
其源代码可在 GitHub 上获取:https://github.com/rkern/line_profiler,PyPI 页面为:https://pypi.python.org/pypi/line_profiler/。和 cProfile 相比,它有相当大的开销,需要多 12 倍的时间才能得到一个分析结果。
要使用这个工具,你首先需要通过 pip 添加:pip install pip install Cython ipython==5.4.1 line_profiler(CPython2)。这个分析器的一个主要缺点是不支持 PyPy。
就像在使用 memory_profiler 时一样,你需要在你想分析的函数上加上一个装饰。在我们的例子中,你需要在 03.primes-v1.py 中的 primes 函数的定义前加上 @profile。然后像这样调用:
kernprof -l 03.primes-v1.py
python -m line_profiler 03.primes-v1.py.lprof
你会得到一个这样的输出:
Timer unit: 1e-06 s
Total time: 181.595 s
File: 03.primes-v1.py
Function: primes at line 3
Line # Hits Time Per Hit % Time Line Contents
==============================================================
3 @profile
4 def primes(n):
5 40 107 2.7 0.0 if n == 2:
6 return [2]
7 40 49 1.2 0.0 elif n < 2:
8 return []
9 40 44 1.1 0.0 s = []
10 39999960 34410114 0.9 18.9 for i in range(3, n+1):
11 39999920 29570173 0.7 16.3 if i % 2 != 0:
12 19999960 14976433 0.7 8.2 s.append(i)
13 40 329 8.2 0.0 mroot = n ** 0.5
14 40 82 2.0 0.0 half = (n + 1) / 2 - 1
15 40 46 1.1 0.0 i = 0
16 40 30 0.8 0.0 m = 3
17 20000 17305 0.9 0.0 while m <= mroot:
18 19960 16418 0.8 0.0 if s[i]:
19 6680 6798 1.0 0.0 j = (m * m - 3) / 2
20 6680 6646 1.0 0.0 s[j] = 0
21 32449400 22509523 0.7 12.4 while j < half:
22 32442720 26671867 0.8 14.7 s[j] = 0
23 32442720 22913591 0.7 12.6 j += m
24 19960 15078 0.8 0.0 i = i + 1
25 19960 16170 0.8 0.0 m = 2 * i + 3
26 40 87 2.2 0.0 l = [2]
27 20000000 14292643 0.7 7.9 for x in s:
28 19999960 13753547 0.7 7.6 if x:
29 3139880 2417421 0.8 1.3 l.append(x)
30 40 33 0.8 0.0 return l
我们可以看到两个循环在反复调用 list.append,占用了脚本的大部分时间。
pprofile
地址:http://github.com/vpelletier/pprofile
据作者介绍,pprofile 是一个「行粒度的、可感知线程的确定性和统计性纯 Python 分析器」。
它的灵感来源于 line_profiler,修复了大量缺陷,但因为其完全是用 Python 写的,所以也可以通过 PyPy 使用。和 cProfile 相比,使用 CPython 时分析的时间会多 28 倍,使用 PyPy 时的分析时间会长 10 倍,但具有粒度更大的细节水平。
而且还支持 PyPy 了!除此之外,它还支持线程分析,这在很多情况下都很有用。
要使用这个工具,你首先需要通过 pip 安装:pip install pprofile(CPython2)/ pypy -m pip install pprofile(PyPy),然后像这样调用:
pprofile 03.primes-v1.py
其输出和前面工具的输出不同,如下:
Benchmark duration: 886.8774709701538 seconds
Command line: ['03.primes-v1.py']
Total duration: 886.878s
File: 03.primes-v1.py
File duration: 886.878s (100.00%)
Line #| Hits| Time| Time per hit| %|Source code
------+----------+-------------+-------------+-------+-----------
1| 2| 7.10487e-05| 3.55244e-05| 0.00%|import time
2| 0| 0| 0| 0.00%|
3| 0| 0| 0| 0.00%|
4| 41| 0.00029397| 7.17e-06| 0.00%|def primes(n):
5| 40| 0.000231266| 5.78165e-06| 0.00%| if n == 2:
6| 0| 0| 0| 0.00%| return [2]
7| 40| 0.000178337| 4.45843e-06| 0.00%| elif n < 2:
8| 0| 0| 0| 0.00%| return []
9| 40| 0.000188112| 4.70281e-06| 0.00%| s = []
10| 39999960| 159.268| 3.98171e-06| 17.96%| for i in range(3, n+1):
11| 39999920| 152.924| 3.82312e-06| 17.24%| if i % 2 != 0:
12| 19999960| 76.2135| 3.81068e-06| 8.59%| s.append(i)
13| 40| 0.00147367| 3.68416e-05| 0.00%| mroot = n ** 0.5
14| 40| 0.000319004| 7.9751e-06| 0.00%| half = (n + 1) / 2 - 1
15| 40| 0.000220776| 5.51939e-06| 0.00%| i = 0
16| 40| 0.000243902| 6.09756e-06| 0.00%| m = 3
17| 20000| 0.0777466| 3.88733e-06| 0.01%| while m <= mroot:
18| 19960| 0.0774016| 3.87784e-06| 0.01%| if s[i]:
19| 6680| 0.0278566| 4.17015e-06| 0.00%| j = (m * m - 3) / 2
20| 6680| 0.0275929| 4.13067e-06| 0.00%| s[j] = 0
21| 32449400| 114.858| 3.5396e-06| 12.95%| while j < half:
22| 32442720| 120.841| 3.72475e-06| 13.63%| s[j] = 0
23| 32442720| 114.432| 3.5272e-06| 12.90%| j += m
24| 19960| 0.0749919| 3.75711e-06| 0.01%| i = i + 1
25| 19960| 0.0765574| 3.83554e-06| 0.01%| m = 2 * i + 3
26| 40| 0.000222206| 5.55515e-06| 0.00%| l = [2]
27| 20000000| 68.8031| 3.44016e-06| 7.76%| for x in s:
28| 19999960| 67.9391| 3.39696e-06| 7.66%| if x:
29| 3139880| 10.9989| 3.50295e-06| 1.24%| l.append(x)
30| 40| 0.000155687| 3.89218e-06| 0.00%| return l
31| 0| 0| 0| 0.00%|
32| 0| 0| 0| 0.00%|
33| 2| 8.10623e-06| 4.05312e-06| 0.00%|def benchmark():
34| 1| 5.00679e-06| 5.00679e-06| 0.00%| start = time.time()
35| 41| 0.00101089| 2.4656e-05| 0.00%| for _ in xrange(40):
36| 40| 0.232263| 0.00580657| 0.03%| count = len(primes(1000000))
(call)| 40| 886.644| 22.1661| 99.97%|# 03.primes-v1.py:4 primes
37| 1| 5.96046e-06| 5.96046e-06| 0.00%| end = time.time()
38| 1| 0.000678062| 0.000678062| 0.00%| print "Benchmark duration: %r seconds" % (end-start)
39| 0| 0| 0| 0.00%|
40| 0| 0| 0| 0.00%|
41| 1| 5.79357e-05| 5.79357e-05| 0.00%|benchmark()
(call)| 1| 886.878| 886.878|100.00%|# 03.primes-v1.py:33 benchmark
我们现在可以看到更详细的细节。让我们稍微研究一下这个输出。这是这个脚本的整个输出,每一行你可以看到调用的次数、运行它所用的时间(秒)、每次调用的时间和占全局时间的比例。此外,pprofile 还为我们的输出增加了额外的行(比如 44 和 50 行,行前面写着 (call)),这是累积指标。
同样,我们可以看到有两个循环在反复调用 list.append,占用了脚本的大部分时间。
vprof
地址:https://github.com/nvdv/vprof
vprof 是一个 Python 分析器,为各种 Python 程序特点提供了丰富的交互式可视化,比如运行时间和内存使用。这是一个图形化工具,基于 Node.JS,可在网页上展示结果。
使用这个工具,你可以针对相关 Python 脚本查看下面的一项或多项内容:
CPU flame graph
代码分析(code profiling)
内存图(memory graph)
代码热图(code heatmap)
要使用这个工具,你首先需要通过 pip 安装:pip install vprof(CPython2)/ pypy -m pip install vprof(PyPy)。
在 CPython2 上,要显示代码热图(下面的第一行调用)和代码分析(下面的第二行调用):
vprof -c h 03.primes-v1.py
vprof -c p 03.primes-v1.py
在 PyPy 上,要显示代码热图(下面的第一行调用)和代码分析(下面的第二行调用):
pypy -m vprof -c h 03.primes-v1.py
pypy -m vprof -c p 03.primes-v1.py
在上面的两个例子中,你都会看到如下的代码热图:
以及如下的代码分析:
结果是以图形化的方式展示的,你可以将鼠标悬浮或点击每一行,从而查看更多信息。
同样,我们可以看到有两个循环在反复调用 list.append,占用了脚本的大部分时间。
2. 音乐剧摇滚年代有哪些金曲?
1.Any Way You Want It /I Wanna Rock
2.Can't Fight This Feeling
3.Cum On Feel The Noize
4.Don't Stop Believin'
5.Every Rose Has It's Thorn
6.Harden My Heart /Shadows Of The Night
7.Heaven/ More Than Words To Be With You
8.Here I Go Again
9.High Enough
10.Hit Me With Your Best Shot
11.I Hate Myself For Loving You
12.Heat Of The Moment
13.I Want To Know What Love Is
14.Just Like Paradise/ Nothin' But A Good Time
15.Oh Sherrie
16.Sister Christian
17.The Final Countdown
18.The Search Is Over
19.Waiting For A Girl Like You
20.Wanted Dead Or Alive
21.We Built This City /Too Much Time On My Hands
22.We're Not Gonna Take It
3. 有什么好的视频编辑软件是适合苹果电脑mac下载的呢?
如果不是专业的处理视频,那我相信iMovie已经足够满足你的需求了,再专业的软件mac下当然是Final Cut Pro莫属,当然也可以用ADOBE的PR来处理,有mac版的,特效就用苹果的Motion或者ADOBE的AE吧。
下面是软件推荐及介绍 (默认平台为PC,其它平台括号里有标注)SolveigMM Video Splitter (荐)
先说明一点,这个不是非线性编辑软件,功能单一,只有剪切视频的功能。不要跟Pr、Vegas,FCP比较,不是同类软件好么!!!优点:小巧(51MB)、简单好用(非编软件都算不上的剪辑软件能不简单好用么),学习成本可以忽略不计、视频可以无损剪辑、项目周期短(就是导出非常非常快,跟前面是因果关系)、在我试过的所有同类软件中剪辑是最精确的(其它软件只能精确到关键帧)、缺点:收费(不考虑盗版)、不能加速播放、太尼玛简单了,不能非线性编辑,不能添加后期效果(人家定位本来就跟Pr,Vegas等不一样好么,没有这个需求的话就不是缺点了)补充,SolveigMM Video Splitter 支持的格式见下图,包含了绝大多数的格式Potplayer没错这是个视频播放软件,但是可以达到题主的要求,使用方法是:播放时用播放器自带的功能(当然你要用另外的软件比如Bandicam录制也可以)录制屏幕优点:播放控制顺手、能加速播放、基本没有学习成本、由于并非像QQ影音一样是截取视频,而是录制,因此应该是能精确定位的,理论上哈,原谅我不负责任一次。可能缺点:录制时不能加速播放、视频画质有损失(参数调的好可以忽略不计)、没有后期功能
Potplayer + SolveigMM Video Splitter (荐)没错,前两个软件可以搭配使用,方法是:用PotPlayer方便的确定所需要剪辑的时间段(其实就是为了能用加速播放,因此只要是有加速播放功能的播放器就行,不一定要Potplayer),再在SolveigMM Video Splitter 中剪辑。缺点:SVS收费、稍微稍微麻烦、没有后期功能(还是那句话,没有这个需求就不是缺点)
Corel VideoStudio Pro (绘声绘影)、iMovie (MAC)、AVS Video Editor我在这再推荐一个软件吧!GoPro自带的剪辑软件,GoPro Studio。软件免费WIN/MAC平台都有,在GoPro官网可以下载世界上功能最多的摄像机
这个软件介于普通剪辑软件和专业剪辑软件之间。界面很友好很容易上手,不会剪辑的同学,它还为你提供了镜头剪辑的模版。还可以简单添加字幕,改变视频帧率,视频调色等等稍微专业一点功能。看到题主说需要精确的剪辑,在软件里控制电脑的左右方向键可以提供精确的视频的每一帧预览。还有一点很好,这个软件在你导入素材之后,可以进行粗略的第一次剪辑。然后选择你需要的视频片段,软件会自动转码。然后就可以输出到软件的编辑区。
第一步导入了转码:第二步就可以进一步编辑,添加音频和字母:软件还提供了剪辑的模版,模版还可以网上下载:第三步视频共享,可以输出MOV格式,或者共享到网站。如果有苹果电脑的朋友我还是推荐iMovie入门,入门之后就可以学习FCPX。个人认为苹果的剪辑软件比较适合入门的朋友,可视化很直观。4. cumshot什么意思?
cumshot
英音: [`kRmFOt] 美音: [`kRmFOt]
名词&v. 射精
5. 请问足球比赛里助攻是怎么算的?
助攻,是足球战术统计的一项数据。由于存在不同的数据统计机构和统计口径,对于助攻的定义并不完全一样。
下面我们以最著名的数据统计机构OPTA为例。该统计机构对于自己统计的数据有严格的定义,详情可以点击这个链接:http://optasports.com/news-area/blog-optas-event-definitions.aspx
在这个链接里说得很明白,所谓助攻(assist),就是The final pass or pass-cum-shot leading to the recipient of the ball scoring a goal.(接球者打入进球前的那最后一传或者是传射,都叫作助攻。)最后一传比较好理解,传射指的是你也搞不清楚他是想射门还是传球,反正这个球最后到了队友脚下,队友把球打进去了。
从定义可以看出,助攻这个数据也有欺骗性:比如本赛季欧冠首轮比赛中,切尔西门将库尔图瓦传给自己的右后卫扎帕科斯塔,扎帕科斯塔带球过人杀到对方半场后直接射门中鹄,结果算库尔图瓦一次助攻,也是2012年11月凯尔特人门将弗雷泽·福斯特在对巴塞罗那的比赛中助攻以来,门将在欧冠赛场的第一次助攻。可这个助攻数据,比起其它很多人的关键传球来说,刷得实在太便宜了。
顺便说一下的是,统计中还常见的词语是“创造机会(Chance created)”——所谓创造机会,通俗讲就很简单,就是导致队友射门一次的那记传球。射门进不进不管,都是创造机会。那些打进的,就是助攻。那些没有打进的,就是“关键传球(Key pass)”。所以,创造机会=助攻+关键传球。
以上是OPTA对助攻的定义。但在很多“梦幻联赛”足球游戏中,助攻还有多种繁杂的定义。比如,有些规定,射门被门将扑出或者后卫、门柱挡出,随后补射,头一个射门的球员算助攻。还有些规定,赢得导致进球的点球或任意球,算助攻一次。还有的规定,传球射门导致对手乌龙球的,也算助攻一次。但这些都算是相当另类的助攻统计,一般助攻以OPTA定义为准。【完】
6. Pro非常好用的软件有哪些?
人人都会用到的十款Mac必备软件分享,新人必备,献给大家(完全版)
威锋大神干货,转过来吧!
1. 全能解压
使用Mac以后感觉Mac自带的归档实用工具其实还算不错:能够打开的格式很多,并且打开速度较快,解压稳定性强。可是,在很多复杂的应用场景下,找一个文章文档,需要把很多文件一起解压,时间浪费的不多,但极容易让人感到厌烦。之后推荐的the Unarchiver,在我感觉和归档类似,不能算特别出彩,直到看到全能解压。软件本身是App Store的一款免费软件,但是软件的功能确实要比很多付费软件还要强大。在单纯的解压方面,软件和the Unarchiver一样,都可以无乱码的快速解压;在扩展功能上,软件更胜一筹:能够在不解压的情况下,对包内文件进行预览,打开,部分解压缩和选择解压路径等等。在工作和生活中来说,全能解压相较于其他两款软件,确实是要实用的太多了,这也是我第一个把它放上来的主要缘故。
2. 每日英语听力
这款软件也是我的最爱,在之前准备ya si kao shi 的时候,是这款软件帮助我大大提升了自己的英语能力。软件有几个优点,让我觉得不能不说:颜值高。软件的整个界面做的都非常的清爽干净,菜单栏,工具栏设置合理,一目了然,让人能够很快上手,而不是像很多软件那样,用一个功能都需要找半天。语料全。从幼儿园到native speaker,不论是什么英语水平,都能在这里找到合适的语料,尤其是考试语料,包括了王陆的语料库,雅思和托福,四六级考试的模拟听力,都是很难找到的素材。功能强。不仅绝大部分语料都有中文,能够让大家听之后知其所以然;其内部集成的播放器可以调整倍速播放,可以减慢速度帮助跟读,也可以倍速锻炼语感。这样一款英语学习软件,不仅仅是需要考试的小孩子需要,即便步入职场,希望潜移默化的锻炼自己的听力,也完全可以考虑这一款软件。
3. The Brain思维导图
在我们步入社会之后会经常使用,往往用来帮助我们理清项目的逻辑结构,进行任务安排和梳理。然而到我们的实际生活中,或者是多项目并行的情况下,其实思维导图就会有所局限了。究其原因主要是因为现存思维导图的树状结构和我们的思考模式不同。在我们提到“父亲”这个词的时候,你最先开始想到的会是父亲的特性,比如他的身份,长相,脾性等等,而不是他的从属关系。树状结构强调的是元素间的从属关系,而人类在思考的时候,会是一个发散的结构,这就是为什么思维导图在复杂情况下,用处不大的主要原因。The Brain是一款思维导图,并且是真正按照人类思维模式进行设计的。在使用这个思维导图的时候,你会有先将事物的性质等填入,之后将相同性质的事物进行关联。在开始使用的时候感觉很困难,毕竟要把事情事无巨细的进行记录,每天都需要消耗10分钟左右,但一段时间以后,你会有惊喜的收获:The Brain相当于复制了你的大脑和思维,并且它永远不会遗忘。从这点来说,The Brain确实非常强力。
4. 印象笔记
这款软件似乎已经被大家推荐烂了,但是究竟为什么要用它,它到底有什么特别之处,很少有人能给出一个准确的答案。现在的市场上,类似的笔记类软件,除了EverNote,Microsoft的OneNote,还有各种各样的云笔记,其中不乏中国大厂的产品,然而私心里还是更推荐最开始的两款。各种原因不多阐述,而且这两款软件不论是日常随笔还是知识纪录都是够用的了。印象笔记这类软件,使用主要是为了两个目的:资料整理和知识纪录;笔记记录和知识体系整理。前者印象笔记更优,后者OneNote领先。印象笔记是一种资料库的感觉,它的内部没有恨规整的目录结构,但是它的搜索引擎做的非常棒:即便是你在图片中写的字,在搜索的时候也能够搜索出来。这就好比我们现在用的百度,Google等搜索引擎,在创建自我的知识体系,对自己的知识进行整理的时候是很有用的。另一方面,印象笔记给人更高的自由度,有一种真实的记笔记的感觉,也是需要表扬的。而OneNote更给人一种模块感,所有的内容都是一个个的大板块页,下来再有小板块分级。所以如果你是希望分门别类按章按节的写点什么,那OneNote会更适合。顺嘴忘了说,在同步方面,OneNote明显更弱,如果你需要进行频繁的多设备记录,或是和一个项目组共同使用笔记,那还是尽量考虑印象笔记吧。
5. 1Password
如今大家的生活越来越电子化,大到投资理财,小到日常购物,都离不开网络。日常需要使用的帐号,大大小小能数出十多个,密码的管理问题也一直是我们的“心腹大患“。虽然每个人都知道,使用随机生成的密码,复杂度较高的密码和定期更换密码能够让我们的账户安全得到提升,但是,管理起来确实容易秒崩记串不解释。其实大多数使用Mac 的小伙伴,都对Mac 的钥匙串赞不绝口,轻量级的钥匙串能够记忆你的每一个密码,并在你输入新密码时对应更新,在使用体验上是非常方便的。但是钥匙串拥有一定的局限性:无法自动生成随机密码,记录的密码全部来自于你的输入;只能管理线上账户,对于你的银行密码,手机账户等无能为力。如果你希望自动生成随机密码,并对线下的账户进行管理,那你可能需要第三方软件的支持。1Password是我比较推荐的一款密码管理类软件,上述说的功能都包括:密码自动生成,线下账户密码管理,密码保存同步等等,可以说是钥匙串的加强版。整体界面设计的也非常不错,简洁不简陋,是比较适合像我一样的健忘症同志的。但是,1Password的使用也是存在一些问题的。首先,1Password的价格并不便宜,相对于自带的钥匙串,要多花几百大洋究竟值不值,有时候仁者见仁智者见智。其次,1Password之前一直宣称密码的安全性是非常高的,然而之前也爆出过安全漏洞。虽然有那么多让人纠结的点,1Password放在这里推荐也是有几个特殊的原因的。第一,名气和口碑。放眼望去,几乎在打架推荐密码管理软件的时候,1Password总是有一席之地,口碑和使用体验也很不错。其次,虽然有安全漏洞,但是几乎所有的密码管理软件,加密密码的方式都是类似的,在这次爆出安全漏洞后进行自查,1Password的安全性可能不减反增。最后,软件现在转变了销售策略,小伙伴们能够先下载使用,3个月(我应该没记错)的试用期过后再决定是否购买。P.S.我知道打了很多字了,但是还是说一下,钥匙串和1Password是可以在多平台同步的。当然,钥匙串只能在苹果的设备,通过Apple ID进行同步,而1Password则可以在win(额外付费),苹果设备间通过帐号进行同步。
6. Dr. Cleaner Pro
从开始用Mac 的第一天起,各种有关到底Mac用不用清理类软件的观点和讨论就如雨点般向我打来,而且最崩溃的是,两方都有理有据,还有数据支撑,有一种被亲爸妈一人一只手使劲拉的碎裂感,直到遇到了Pro,才帮我解决了这个问题。Pro确实拥有非常不错的内存清理功能,但是我更希望提及的是它对文件和软件的管理。对文件来说,Pro能帮助我们找到Mac内你不需要的文件,包括了重复文件,大文件,垃圾文件等等。这一点我觉得是非常实用的。对于曾经的一个 糙男,如果不是磁盘爆炸,我是基本不会去清理下载的电影,图片之类的文件的,但是,通过Google,迅雷,wechat等等渠道下载的文件往往会被默认保存到不同的地方去(是的,那时候就那么懒。。),在清理的时候往往找不到文件去了哪儿。又或者在准备论文和文档材料的时候,各个地方复制粘贴,做完一个论文才发现Mac里有了那么多一样内容的文件。有心大手一挥全部删除,但又担心忘记留备份,只能苦逼的一个一个文件打开查看。所以我发现Pro能够直接扫描重复文件,大文件的时候就毫不犹豫的下载了。对软件的管理,是我一定要给十个赞的神奇功能。Mac内的App Store虽然软件齐全,但是有更多的软件是在App Store外部进行销售的,而这一类的软件有一个共同的优点:常规方式卸载不掉。也就是说,你不能够简简单单拖拽删除,或者看它不爽的时候长时间选中和它说再见。它们大多需要找到原本的文件包,通过内部的卸载软件进行卸载。而在拥有了Pro之后,你能够直接通过Pro,直观的查看到软件和相关文件的大小,并且彻彻底底的将软件从你的Mac 上卸载掉。至于本身携带的内存清理功能,反而体会不到太大的存在感——不是功能不好,而是Pro对内存的清理,基本上是自发的,不需要更多的操作。新Mac对这个功能不是特别看重,但像我这样的老爷机,确实在Pro 的帮助下有了更好的使用体验,直观的感受是“office全家福”死的次数越来越少了。Pro是一款付费软件,价格大概是在100以内,和一些同类软件相比价格也是比较实惠的了,而功能非常实用和可靠,在App Store 内的排名也非常高,算是推荐的主要原因了。
7. Movist
Mac上的QuickTime堪称神器,不仅能够进行音视频的播放,还能够用来录屏,录音等等。但是单丛播放这个角度上来看,感觉QuickTime有一些地方不是很人性化。比如,QuickTime没有视频列表,在播放完一个视频之后,你只能从新返回选择播放;部分格式的视频,无法打开或是崩溃。最让人不爽的是,想要快进的时候,通过方向键的向左或向右无法拉动进度,只能手动拉动进度条,真的很不舒服。Movist相比较来说,单单在视频播放的角度做的要出彩的多。除了解决以上几个强迫症不能忍问题外,Movist还有很多的高级设置,包括导入字幕,视轨声轨,通过触摸板上下滑调节音量等等,在观看体验上是很不错的。软件同样收费,价格在¥30左右。去年自己做了一个小的表格,看了一下现在主流的几款视频播放器的具体功能,并且做了一个简单的比较,就放图说话吧。(PS:不是很喜欢爱奇艺,优酷等客户端带的播放器,有广告,而且经常会崩溃,尤其优酷)
8. 泼辣修图
修图已经不仅仅是小撮少女的专利了,现在从男到女,从老到少,修图已经成为了全民必备技能。PS虽说是修图神器,功能全面,但是平常图片不需要精修,花重金购买PS总觉得杀鸡用了牛刀,操作也比较复杂;美图秀秀虽然也不错,但是没有客户端,网页版本的使用有局限性,而且略烦。泼辣修图拥有如下几个优点,让我觉得不得不推荐给大家:第一,免费且功能全面。这里说的是精简版,但功能绝对不精简,滤镜,色调,暗角曲线,光效,质感还有N多高级功能,比肩很多收费软件。虽然看起来功能不算太多,但是日常的修图,已经完全够用了。第二,界面友好。很多修图软件,界面就不让我信任你——你想帮我把照片变得更美一点,可连你的界面都让我不自信。泼辣修图,全中文操作,界面简洁美观,享受美,能够从打开软件开始。第三,使用体验高。不仅每一个按钮都清晰明了容易使用,更重要的是,第一次使用的时候有教程,这点超贴心有木有!每次使用新功能都会有教程!手残党和摸索不成党的绝对福利!
9. 幕布
幕布是一款专业的大纲记录软件。在你完成一件事情之前,你能够对事情进行大致的了解,之后对每一步和预期将要遇到的困难进行罗列和整理,从而达到在面对困难时有所准备,从容应对的效果。
推荐幕布有三个理由:简单的操作,良好的使用体验和强大的扩展。幕布的操作和传统的软件完全不一样,大纲的写作方式完全和常见的文本编辑方式一致,绝大多数情况下,你可以在没有鼠标的情况下使用幕布。你完全不需要在鼠标和键盘间来回切换,为内容添加优先级和逻辑关系——是的,这些内容都可以使用键盘来完成。其次,对于这样开拓性的设计,很多人都会担心上手困难。在幕布,第一次打开软件的时候会有非常详细的教程说明,小白也能够轻松上手。最后,值得一提的是,软件还能够快速导出思维导图,支持富文本和文件插入,支持文件和文件夹系统等等。幕布充分考虑了人「懒」的特性,简化了大纲的操作和反馈机制,让大家更愿意进行大纲的记录和写作,在事情开始前和结束后都能有很好的反馈,从而提升效率。10. ControlPlane
绝对的小众软件,功能虽小但很贴心。虽然Safari和Google Chrome在功能和性能上很难分出优劣,但是不可否认的是,Safari的耗电量要相对更低,而Chrome的扩展则更多,功能也更加的丰富。在接通电源的时候,我们可以使用Chrome,来享受更多的扩展和功能;而在断电情况下,Safari明显更受欢迎。但是手动的方式来调整浏览器是一件比较繁琐的事情,CP就是一款帮助大家完成浏览器切换自动化的软件。在下载安装软件之后,打开我们会看到内部有通用(General)、情境(Contexts)、迹象(Evidence Sources)、规则(Rules)、动作(Actions)、高级(Advanced)等等选项卡,在使用的时候,我们需要设定规则,在特定的迹象出现的时候,触发对应的规则;软件将根据电脑到底处于什么样的情境,然后采用对应的动作。软件的功能非常丰富,不仅仅是根据电源状况设置默认浏览器,你还能够根据蓝牙状态,外置存储,以至于IP地址,地理位置,光线强弱等等都可以作为情境出现的条件;可以执行的动作还有打开文件/应用、加载/推出设备和开关WIFI之类的。
**********补充软件*************
补充:安全防护问题本来说好了十款软件的,但是上周五开始爆发的bitcoin勒索事件,让我觉得必须要提一嘴Mac安全防护的事情。先说下整个事件,防止有小伙伴一头雾水。从上周五开始,全世界范围内陆续有Windows用户中电脑病毒,电脑内所有文件被加密,必须要给黑客进行bitcoin汇款才能够打开(虽然貌似汇了钱也没有用),平均一个bitcoin价格大概在$1690左右,而每次勒索1~3个bitcoin左右。此次中招的用户大多没有及时更新系统漏洞,尤以学校和医院为重。大批毕设论文写好的学生,论文被锁定无法打开,医院系统瘫痪引发众怒也得到了大家更多的关注。这虽然是Windows下的事,而Mac的安全性能也更优秀,但Mac的使用安全远非高枕无忧:Mac的安全漏洞每年都会发现几个,而针对Mac电脑的相关病毒也有一些,只是因为Mac的使用占比仅在10%左右,所以目前还没有被针对攻击。日前,第二次病毒潮将汹涌而来,波及范围更广,病毒能力更强,即便波及不到Mac用户,我觉得大家也应该了解一些关于Mac的安全防护的点。第一,不要在App Store外下软件,尤其是一些你听都没听说过的平台。App Store每一个上架软件,从上架申请开始就需要进行审核,对软件的内容,更新,功能都有很高的要求。也许它们各自都有槽点,但说有能够在Apple的严苛审核下还能蒙混过关的病毒,概率是真的不大。所以,只要不在App Store外随意下载软件,中毒概率其实就会小很多。第二,密码请具有多样性。很多人为了方便把密码设置为自己的生日,或是所有地方的密码一个样,老实说是很危险的一件事。密码和用户名在一些安全防护等级较差的网站,是会直接加密后放在网址里的,这些加密并不算复杂,而现在手机和QQ基本上能当作我们的“网络shen fen zheng ”来用了,你的用户名也就很难保密,如果连密码也一个样,那一旦破译了一个,就有危险全军覆没。使用随机数密码,通过软件或钥匙串记录,能最大限度的保证账号安全。第三,三方软件帮助。电脑病毒分成很多种,简单可以认为有三种。第一种,类似于bitcoin事件,在你的电脑内限制你的访问和操作,达到勒索目的;第二种,破坏xing bing 毒,对你的文件进行破坏,或强行进行控制操作;第三种,不吵不闹乖乖呆在你的电脑,负责记录和收集你的数据发送给黑客。前两种症状很明显,但第三种有时候完全觉察不出来,用一些好的三方软件定期扫描是很有必要的。我自己现在用的是趋势安全大师,扫描免费,杀毒收费,不像很多软件那样,想扫描都要买软件,买下来一年杀不了一个病毒,白白浪费钱,病毒库实时更新,技术支持也很快速。经验之谈:不要用Windows 下你听的最多的三款软件,尤其是免费的,你真的会崩的。。。(其他的杀毒软件貌似都在Store外销售,只有这款进了App Store的排行榜,如果自己有常用的也没关系)总之,在这个Windows系统男默女泪打病毒的关键时期,希望麦友们看戏别忘自身,全都能有一个安全稳定的Mac使用环境。
本站涵盖的内容、图片、视频等数据系网络收集,部分未能与原作者取得联系。若涉及版权问题,请联系我们删除!联系邮箱:ynstorm@foxmail.com 谢谢支持!