这是引言中第一页第二段的内容朱莉娅手册:
由于 Julia 的编译器与 Python 或 R 等语言使用的解释器不同,因此您一开始可能会发现 Julia 的性能并不直观。如果您发现某些事情很慢,我们强烈建议您仔细阅读性能技巧尝试其他任何操作之前的部分。一旦您了解了 Julia 的工作原理,就可以轻松编写几乎与 C 一样快的代码。
Excerpt:
避免全局变量
全局变量的值可能会随时发生变化,因此其类型也可能会发生变化。这使得编译器很难使用全局变量来优化代码。变量应该是本地的,或者尽可能作为参数传递给函数。
任何对性能至关重要或正在进行基准测试的代码都应该位于函数内。
我们发现全局名称通常是常量,这样声明它们可以极大地提高性能
知道script(所有程序顶级代码)风格在许多科学计算用户中非常普遍,我建议您至少将整个文件包装在一个let
初学者的表达式(让我们引入一个新的本地范围),即:
let
redim = 2
# Loading data
iris_data = readdlm("iris_data.csv")
iris_target = readdlm("iris_target.csv")
# Center data
iris_data = broadcast(-, iris_data, mean(iris_data, 1))
n_data, n_dim = size(iris_data)
Sw = zeros(n_dim, n_dim)
Sb = zeros(n_dim, n_dim)
C = cov(iris_data)
classes = unique(iris_target)
for i=1:length(classes)
index = find(x -> x==classes[i], iris_target)
d = iris_data[index,:]
classcov = cov(d)
Sw += length(index) / n_data .* classcov
end
Sb = C - Sw
evals, evecs = eig(Sw, Sb)
w = evecs[:,1:redim]
new_data = iris_data * w
end
但我也强烈建议您将其重构为小函数,然后编写一个main
调用其余部分的函数,类似这样,请注意此重构如何使您的代码通用且可重用(并且快速):
module LinearDiscriminantAnalysis
export load_data, center_data
"Returns data and target Matrices."
load_data(data_path, target_path) = (readdlm(data_path), readdlm(target_path))
function center_data(data, target)
data = broadcast(-, data, mean(data, 1))
n_data, n_dim = size(data)
Sw = zeros(n_dim, n_dim)
Sb = zeros(n_dim, n_dim)
C = cov(data)
classes = unique(target)
for i=1:length(classes)
index = find(x -> x==classes[i], target)
d = data[index,:]
classcov = cov(d)
Sw += length(index) / n_data .* classcov
end
Sb = C - Sw
evals, evecs = eig(Sw, Sb)
redim = 2
w = evecs[:,1:redim]
return data * w
end
end
using LinearDiscriminantAnalysis
function main()
iris_data, iris_target = load_data("iris_data.csv", "iris_target.csv")
result = center_data(iris_data, iris_target)
@show result
end
main()
Notes:
- 您不需要所有这些分号。
- 匿名函数目前速度很慢,但在 v0.5 中将会改变。您可以使用快速匿名现在,如果性能至关重要的话。
- 总之,仔细阅读并考虑all性能提示。
-
main
只是一个名称,可以是您喜欢的任何其他名称。