snakeviz_cprofile_性能分析

cProfile

cProfile是标准库内建的分析工具的其中一个,另外两个是hotshot和profile

  • cProfile:基于lsprof的用C语言实现的扩展应用,运行开销比较合理,适合分析运行时间较长的程序,推荐使用这个模块;
  • profile:纯Python实现的性能分析模块,接口和cProfile一致。但在分析程序时增加了很大的运行开销。不过,如果你想扩展profiler的功能,可以通过继承这个模块实现;
  • hotshot:一个试验性的C模块,减少了性能分析时的运行开销,但是需要更长的数据后处理的次数。目前这个模块不再被维护,有可能在新版本中被弃用
查看更多

朴素贝叶斯

贝叶斯公式

动机

贝叶斯为了解决“逆向概率”问题,提出了贝叶斯公式

公式

Posterior knowledge = Prior knowledge X Likelihood

P(A|B) = P(A) * [ P(B|A) / P(B) ]

[ P(B|A) / P(B) ]这部分是了解已知条件后对P(A)的信念更新,叫做“可能性函数”Likelyhood(也翻译成似然函数)

查看更多

消息队列

.

1. 消息队列的定义

消息队列是一个存放消息的容器,一般用于生产者消费者的设计模式,作为一种消息中间剑。

消息队列里存储的数据和数据库的区别是数据库可以查询关系,而消息队列只有当前消息可被查询。

2. 消息队列的优势

1. 通过异步处理提高系统性能(削峰、减少响应所需时间)

img

img

查看更多

rsync

复制文件夹的常用参数 -avz

rsync 原地址结尾处是否加 / 会影响结果:

1
2
3
4
5
rsync -r test/ test2
# test文件夹 复制成了 test2文件夹

$ rsync -r test test2
# test文件夹 复制到了 test2/test 里面

cp不受原地址结尾的影响,但受目标路径的影响

1
2
3
4
cp -r test/   test2 
cp test test2 -r
# 如果test2存在,则复制到test2/test
# 否则复制到 test2

查看更多

写模型代码的流程

流程

一. 模型正向计算(golden输入)

设计模型正向计算, 同时可以确定batch输入数据有什么信息, 以什么格式输入.

二. 数据生成

2.1 洗数据: 一条数据

根据batch输入数据有什么信息, 确定一条数据需要存储的信息和格式. 存储为文件.

2.2 拼接数据: 生成batch数据

把单条数据拼接成batch.

三. 模型预测和评分代码

确定好各个子任务模块需要的评分标准, 确认好各个模块的输入是用golden还是pred.

补全模型里的预测代码.

查看更多

维护有序数组的模块bisect

bisect 模块,用于维护有序列表。实现了一个算法用于插入元素到有序列表。在一些情况下,这比反复排序列表或构造一个大的列表再排序的效率更高。Bisect 是二分法的意思,这里使用二分法来排序,它会将一个元素插入到一个有序列表的合适位置,这使得不需要每次调用 sort 的方式维护有序列表。

以排序顺序插入

看下面的例子,insort()用于按排序顺序将项目插入列表。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import bisect

# A series of random numbers
values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1]

print('New Pos Contents')
print('--- --- --------')

l = []
for i in values:
position = bisect.bisect(l, i) # 显示将会插入的位置, 并未实际插入
bisect.insort(l, i) # 实际插入并维护一个有序数组
print('{:3} {:3}'.format(i, position), l)

# output
# New Pos Contents
# --- --- --------
# 14 0 [14]
# 85 1 [14, 85]
# 77 1 [14, 77, 85]
# 26 1 [14, 26, 77, 85]
# 50 2 [14, 26, 50, 77, 85]
# 45 2 [14, 26, 45, 50, 77, 85]
# 66 4 [14, 26, 45, 50, 66, 77, 85]
# 79 6 [14, 26, 45, 50, 66, 77, 79, 85]
# 10 0 [10, 14, 26, 45, 50, 66, 77, 79, 85]
# 3 0 [3, 10, 14, 26, 45, 50, 66, 77, 79, 85]
# 84 9 [3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85]
# 77 8 [3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]
# 1 0 [1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85]

输出的第一列显示要插入的值。第二列显示数字将插入列表的位置。第三列是当前排序列表。

处理重复

上面例子显示的结果集包括重复值 77bisect模块提供了两种处理重复的方法:可以将新值插入现有值的左侧,也可以插入右侧。insort()函数实际上是 insort_right() 的别名,它在现有值之后插入一个项目。相应的函数insort_left(),在现有值之前插入。

查看更多

关于xlnet的疑问

.

看xlnet得到一个疑问, 这个疑问涉及到transformer的位置向量的表示方法

1
2
3
4
5
6
7
8
# 注意力可以拆分成4部分的和:
A[i, j] = 4个部分的点击(内容1*内容2 + 位置1*内容2 + 位置2*内容1 + 位置1*位置1)

这里的位置和内容是割裂的, 感觉这样的注意力是缺少了对(内容+位置)的整体考量

这是由于 内容+位置表示, 只是线性组合, 之后的计算都可以拆分出来

应该在(内容+位置表示)后加一个非线性变换, 这样两个内容就融在一起了, 之后的计算也没法分开

想到一个解释

因为A最后要过一个softmax, 过了softmax后就有了4个部分的非线性组合效果了.

查看更多