技术背景

Julia是一门为科学计算而生的编程语言,其着重强调了开源、生态与性能。从开源角度来说,相比于Matlab就要友好很多,用户可以免费使用,而且MIT协议应该是最宽松的开源协议之一(截图来自于参考链接3):



而生态则是对表的C/C++语言,我们都知道python是一门生态非常强大的编程语言,各种轮子很大程度上减少了学习成本和工作量,而julia的目标也是如此。最后在性能上是对标的python,我们都知道python作为一门解释性语言,在性能上有较大的牺牲。除非我们使用c++或者fortran去构造动态链接库,然后通过python上层语言来封装,这样才能在性能上有所保障,但是工作量又被放大了。Julia的优势就在于可以达到接近于C语言的性能,同时又能像python一样易于编写,兼顾了性能与开发周期,对科学计算非常的友好。

官网简介

科学计算对性能一直有着最高的需求,但目前各领域的专家却大量使用较慢的动态语言来开展他们的日常工作。 偏爱动态语言有很多很好的理由,因此我们不会舍弃动态的特性。 幸运的是,现代编程语言设计与编译器技术可以大大消除性能折衷(trade-off),并提供有足够生产力的单一环境进行原型设计,而且能高效地部署性能密集型应用程序。 Julia 语言在这其中扮演了这样一个角色:它是一门灵活的动态语言,适合用于科学计算和数值计算,并且性能可与传统的静态类型语言媲美。

由于 Julia 的编译器和其它语言比如 Python 或 R 的解释器有所不同,一开始你可能发现 Julia 的性能并不是很突出。 如果你觉得速度有点慢,我们强烈建议在尝试其他功能前,先读一读文档中的提高性能的窍门。 在理解了 Julia 的运作方式后,写出和 C 一样快的代码对你而言就是小菜一碟。

Julia 拥有可选类型标注和多重派发这两个特性,同时还拥有很棒的性能。 这些都得归功于使用 LLVM 实现的类型推导和即时编译(JIT)技术。Julia 是一门支持过程式、函数式和面向对象的多范式语言。 它像 R、MATLAB 和 Python 一样简单,在高级数值计算方面有丰富的表现力,并且支持通用编程。 为了实现这个目标,Julia 以数学编程语言(mathematical programming languages)为基础,同时也参考了不少流行的动态语言,例如 Lisp、Perl、Python、Lua、和 Ruby。

Julia 与传统动态语言最重要的区别是:

  • 核心语言很小:标准库是用 Julia 自身写的,包括整数运算这样的基础运算
  • 丰富的基础类型:既可用于定义和描述对象,也可用于做可选的类型标注
  • 通过多重派发,可以根据类型的不同,来调用同名函数的不同实现
  • 为不同的参数类型,自动生成高效、专用的代码
  • 接近 C 语言的性能

尽管人们有时会说动态语言是“无类型的”,但实际上绝对不是这样的:每一个对象都有一个类型,无论它是基础的类型(primitive)还是用户自定义的类型。 大多数的动态语言都缺乏类型声明,这意味着程序员无法告诉编译器值的类型,也就无法显式地讨论类型。 另一方面,在静态语言中,往往必须标注对象的类型。但类型只在编译期才存在,而无法在运行时进行操作和表达。 而在 Julia 中,类型本身是运行时的对象,并可用于向编译器传达信息。

类型系统和多重派发是 Julia 语言最主要的特征,但一般不需要显式地手动标注或使用:函数通过函数名称和不同类型参数的组合进行定义,在调用时会派发到最接近(most specific)的定义上去。这样的编程模型非常适合数学化的编程,尤其是在传统的面向对象派发中,一些函数的第一个变量理论上并不“拥有”这样一个操作时。 在 Julia 中运算符只是函数的一个特殊标记——例如,为用户定义的新类型添加加法运算,你只要为 + 函数定义一个新的方法就可以了。 已有的代码就可以无缝接入这个新的类型。

Julia 在设计之初就非常看重性能,再加上它的动态类型推导(可以被可选的类型标注增强),使得 Julia 的计算性能超过了其它的动态语言,甚至能够与静态编译语言竞争。对于大型数值问题,速度一直都是,也一直会是一个重要的关注点:在过去的几十年里,需要处理的数据量很容易与摩尔定律保持同步。

Julia 的目标是创建一个前所未有的集易用、强大、高效于一体的语言。除此之外,Julia 还拥有以下优势:

  • 采用 MIT 许可证:免费又开源
  • 用户自定义类型的速度与兼容性和内建类型一样好
  • 无需特意编写向量化的代码:非向量化的代码就很快
  • 为并行计算和分布式计算设计
  • 轻量级的“绿色”线程:协程
  • 低调又牛逼的类型系统
  • 优雅、可扩展的类型转换和类型提升
  • 对 Unicode 的有效支持,包括但不限于 UTF-8
  • 直接调用 C 函数,无需封装或调用特别的 API
  • 像 Shell 一样强大的管理其他进程的能力
  • 像 Lisp 一样的宏和其他元编程工具

在Manjaro Linux上安装Julia

如果我们直接搜索Julia在Manjaro Linux下的安装方法,很有可能搜到一个类似于参考链接4中所提供的方案。这个方案是从官网下载一个可执行文件,然后将该文件存放到系统路径下。虽然这也不失为一个比较通用的方法,但是我个人更倾向于从系统的源里面去寻找资源,而Manjaro Linux其实是有julia的资源的,只是会有一些依赖需要我们去独立安装。我们先尝试一下直接安装julia:

  1. [dechin-root 2021-softwares]# pacman -S julia
  2. 正在解析依赖关系...
  3. 正在查找软件包冲突...
  4. 警告:正在从目标清单中删除 'blas' ,因为它和 'openblas' 冲突
  5. 软件包 (11) cblas-3.9.0-3 lapack-3.9.0-3 libutf8proc-2.6.1-1 llvm10-libs-10.0.1-4
  6. mbedtls-2.25.0-1 metis-5.1.0.p10-1 openblas-0.3.13-2 openlibm-0.7.5-1
  7. suitesparse-5.9.0-1 tbb-2020.3-1 julia-2:1.5.4-1
  8. 下载大小: 51.24 MiB
  9. 全部安装大小: 272.10 MiB
  10. :: 进行安装吗? [Y/n] Y
  11. :: 正在获取软件包......
  12. cblas-3.9.0-3-x86_64 33.9 KiB 4.73 MiB/s 00:00 [#############################] 100%
  13. metis-5.1.0.p10-1-x86_64 166.6 KiB 2.71 MiB/s 00:00 [#############################] 100%
  14. lapack-3.9.0-3-x86_64 2.3 MiB 9.36 MiB/s 00:00 [#############################] 100%
  15. tbb-2020.3-1-x86_64 393.4 KiB 8.73 MiB/s 00:00 [#############################] 100%
  16. suitesparse-5.9.0-1-x... 1101.7 KiB 9.44 MiB/s 00:00 [#############################] 100%
  17. llvm10-libs-10.0.1-4-... 21.2 MiB 8.32 MiB/s 00:03 [#############################] 100%
  18. openblas-0.3.13-2-x86_64 1448.8 KiB 6.97 MiB/s 00:00 [#############################] 100%
  19. libutf8proc-2.6.1-1-x... 76.9 KiB 25.0 MiB/s 00:00 [#############################] 100%
  20. mbedtls-2.25.0-1-x86_64 848.9 KiB 4.30 MiB/s 00:00 [#############################] 100%
  21. openlibm-0.7.5-1-x86_64 111.5 KiB 4.03 MiB/s 00:00 [#############################] 100%
  22. julia-2:1.5.4-1-x86_64 23.6 MiB 2.90 MiB/s 00:08 [#############################] 100%
  23. (11/11) 正在检查密钥环里的密钥 [#############################] 100%
  24. (11/11) 正在检查软件包完整性 [#############################] 100%
  25. (11/11) 正在加载软件包文件 [#############################] 100%
  26. (11/11) 正在检查文件冲突 [#############################] 100%
  27. (11/11) 正在检查可用存储空间 [#############################] 100%
  28. :: 正在处理软件包的变化...
  29. ( 1/11) 正在安装 openblas [#############################] 100%
  30. ( 2/11) 正在安装 cblas [#############################] 100%
  31. ( 3/11) 正在安装 libutf8proc [#############################] 100%
  32. ( 4/11) 正在安装 metis [#############################] 100%
  33. ( 5/11) 正在安装 lapack [#############################] 100%
  34. ( 6/11) 正在安装 tbb [#############################] 100%
  35. ( 7/11) 正在安装 suitesparse [#############################] 100%
  36. ( 8/11) 正在安装 mbedtls [#############################] 100%
  37. ( 9/11) 正在安装 openlibm [#############################] 100%
  38. (10/11) 正在安装 llvm10-libs [#############################] 100%
  39. (11/11) 正在安装 julia [#############################] 100%
  40. julia 的可选依赖
  41. gnuplot: If using the Gaston Package from julia
  42. :: 正在运行事务后钩子函数...
  43. (1/3) Arming ConditionNeedsUpdate...
  44. (2/3) Updating icon theme caches...
  45. (3/3) Updating the desktop file MIME type cache...

安装下来倒是没报错,看起来没什么问题,我们执行一下julia的命令行试试:

  1. [dechin-root 2021-softwares]# julia
  2. julia: /usr/bin/../lib/libc.so.6: version `GLIBC_2.33' not found (required by /usr/bin/../lib/libjulia.so.1)

这一下问题就暴露出来了,有glibc这个依赖需要我们手动安装,在网上搜了一下方案,直接安装和升级以下两个库即可:

  1. [dechin-root 2021-softwares]# pacman -S glibc lib32-glibc
  2. 正在解析依赖关系...
  3. 正在查找软件包冲突...
  4. 软件包 (2) glibc-2.33-4 lib32-glibc-2.33-4
  5. 下载大小: 13.35 MiB
  6. 全部安装大小: 64.42 MiB
  7. 净更新大小: -0.34 MiB
  8. :: 进行安装吗? [Y/n] Y
  9. :: 正在获取软件包......
  10. glibc-2.33-4-x86_64 9.8 MiB 9.46 MiB/s 00:01 [#############################] 100%
  11. lib32-glibc-2.33-4-x86_64 3.5 MiB 9.56 MiB/s 00:00 [#############################] 100%
  12. (2/2) 正在检查密钥环里的密钥 [#############################] 100%
  13. (2/2) 正在检查软件包完整性 [#############################] 100%
  14. (2/2) 正在加载软件包文件 [#############################] 100%
  15. (2/2) 正在检查文件冲突 [#############################] 100%
  16. (2/2) 正在检查可用存储空间 [#############################] 100%
  17. :: 正在处理软件包的变化...
  18. (1/2) 正在更新 glibc [#############################] 100%
  19. Generating locales...
  20. en_US.UTF-8... done
  21. zh_CN.UTF-8... done
  22. Generation complete.
  23. (2/2) 正在更新 lib32-glibc [#############################] 100%
  24. :: 正在运行事务后钩子函数...
  25. (1/5) Reloading system manager configuration...
  26. (2/5) Creating temporary files...
  27. (3/5) Arming ConditionNeedsUpdate...
  28. (4/5) Restarting cronie for libc upgrade...
  29. (5/5) Updating the info directory file...

安装完成后我们再试一下julia的指令:

  1. [dechin-root 2021-softwares]# julia
  2. _
  3. _ _ _(_)_ | Documentation: https://docs.julialang.org
  4. (_) | (_) (_) |
  5. _ _ _| |_ __ _ | Type "?" for help, "]?" for Pkg help.
  6. | | | | | | |/ _` | |
  7. | | |_| | | | (_| | | Version 1.5.4 (2021-03-11)
  8. _/ |\__'_|_|_|\__'_| |
  9. |__/ |
  10. julia> 1+2
  11. 3
  12. julia> ans
  13. 3
  14. julia> println("Hello World!")
  15. Hello World!

当我们看到这个界面的时候,就表示julia已经安装成功了。

包管理与案例测试

参考了参考链接1中的案例,我们来测试一下julia执行简单的张量网络缩并的功能。关于张量网络计算的背景知识,可以参考一下我们之前写过的这篇介绍python张量网络计算的博客,这里用julia来计算张量网络的话会依赖于Einsum这个第三方包,需要我们来手动安装。首先我们测试一下直接调用这个包的指令,如果这个包已经被安装了,那么调用就不会报错:

  1. julia> using Einsum
  2. ERROR: ArgumentError: Package Einsum not found in current path:
  3. - Run `import Pkg; Pkg.add("Einsum")` to install the Einsum package.
  4. Stacktrace:
  5. [1] run_repl(::REPL.AbstractREPL, ::Any) at /build/julia/src/julia-1.5.4/usr/share/julia/stdlib/v1.5/REPL/src/REPL.jl:288

这里我们发现系统中是没有这个库的,而这里调用的时候也已经提示了我们安装这个包的方法,我们可以尝试直接按照这个指令来安装:

  1. julia> import Pkg
  2. julia> Pkg.add("Einsum")
  3. Installing known registries into `~/.julia`
  4. ######################################################################## 100.0%
  5. Added registry `General` to `~/.julia/registries/General`
  6. Resolving package versions...
  7. Installed Compat v3.25.0
  8. Installed Einsum v0.4.1
  9. Updating `~/.julia/environments/v1.5/Project.toml`
  10. [b7d42ee7] + Einsum v0.4.1
  11. Updating `~/.julia/environments/v1.5/Manifest.toml`
  12. [34da2185] + Compat v3.25.0
  13. [b7d42ee7] + Einsum v0.4.1
  14. [2a0f44e3] + Base64
  15. [ade2ca70] + Dates
  16. [8bb1440f] + DelimitedFiles
  17. [8ba89e20] + Distributed
  18. [b77e0a4c] + InteractiveUtils
  19. [76f85450] + LibGit2
  20. [8f399da3] + Libdl
  21. [37e2e46d] + LinearAlgebra
  22. [56ddb016] + Logging
  23. [d6f4376e] + Markdown
  24. [a63ad114] + Mmap
  25. [44cfe95a] + Pkg
  26. [de0858da] + Printf
  27. [3fa0cd96] + REPL
  28. [9a3f8284] + Random
  29. [ea8e919c] + SHA
  30. [9e88b42a] + Serialization
  31. [1a1011a3] + SharedArrays
  32. [6462fe0b] + Sockets
  33. [2f01184e] + SparseArrays
  34. [10745b16] + Statistics
  35. [8dfed614] + Test
  36. [cf7118a7] + UUIDs
  37. [4ec0a83e] + Unicode

安装过程没有什么问题,那我们再次调用看看:

  1. julia> using Einsum
  2. [ Info: Precompiling Einsum [b7d42ee7-0b51-5a75-98ca-779d3107e4c0]

调用没有问题,说明我们这个包是安装成功了。接下来正式测试一下张量网络缩并的案例:

  1. julia> A = zeros(5,6,7)
  2. 5×6×7 Array{Float64,3}:
  3. [:, :, 1] =
  4. 0.0 0.0 0.0 0.0 0.0 0.0
  5. 0.0 0.0 0.0 0.0 0.0 0.0
  6. 0.0 0.0 0.0 0.0 0.0 0.0
  7. 0.0 0.0 0.0 0.0 0.0 0.0
  8. 0.0 0.0 0.0 0.0 0.0 0.0
  9. [:, :, 2] =
  10. 0.0 0.0 0.0 0.0 0.0 0.0
  11. 0.0 0.0 0.0 0.0 0.0 0.0
  12. 0.0 0.0 0.0 0.0 0.0 0.0
  13. 0.0 0.0 0.0 0.0 0.0 0.0
  14. 0.0 0.0 0.0 0.0 0.0 0.0
  15. [:, :, 3] =
  16. 0.0 0.0 0.0 0.0 0.0 0.0
  17. 0.0 0.0 0.0 0.0 0.0 0.0
  18. 0.0 0.0 0.0 0.0 0.0 0.0
  19. 0.0 0.0 0.0 0.0 0.0 0.0
  20. 0.0 0.0 0.0 0.0 0.0 0.0
  21. [:, :, 4] =
  22. 0.0 0.0 0.0 0.0 0.0 0.0
  23. 0.0 0.0 0.0 0.0 0.0 0.0
  24. 0.0 0.0 0.0 0.0 0.0 0.0
  25. 0.0 0.0 0.0 0.0 0.0 0.0
  26. 0.0 0.0 0.0 0.0 0.0 0.0
  27. [:, :, 5] =
  28. 0.0 0.0 0.0 0.0 0.0 0.0
  29. 0.0 0.0 0.0 0.0 0.0 0.0
  30. 0.0 0.0 0.0 0.0 0.0 0.0
  31. 0.0 0.0 0.0 0.0 0.0 0.0
  32. 0.0 0.0 0.0 0.0 0.0 0.0
  33. [:, :, 6] =
  34. 0.0 0.0 0.0 0.0 0.0 0.0
  35. 0.0 0.0 0.0 0.0 0.0 0.0
  36. 0.0 0.0 0.0 0.0 0.0 0.0
  37. 0.0 0.0 0.0 0.0 0.0 0.0
  38. 0.0 0.0 0.0 0.0 0.0 0.0
  39. [:, :, 7] =
  40. 0.0 0.0 0.0 0.0 0.0 0.0
  41. 0.0 0.0 0.0 0.0 0.0 0.0
  42. 0.0 0.0 0.0 0.0 0.0 0.0
  43. 0.0 0.0 0.0 0.0 0.0 0.0
  44. 0.0 0.0 0.0 0.0 0.0 0.0
  45. julia> X = randn(5,2)
  46. 5×2 Array{Float64,2}:
  47. -0.573591 0.550235
  48. -0.893529 -1.25679
  49. -0.338177 0.632082
  50. -0.304742 2.67068
  51. -0.171912 -0.714813
  52. julia> Y = randn(6,2)
  53. 6×2 Array{Float64,2}:
  54. -0.609149 -0.815229
  55. 0.199472 0.554751
  56. -0.562527 0.259988
  57. -1.65124 1.08916
  58. -0.625242 -0.0391435
  59. -0.943587 -0.695565
  60. julia> Z = randn(7,2)
  61. 7×2 Array{Float64,2}:
  62. 0.311165 0.555719
  63. -0.486201 -1.26421
  64. -1.90713 0.738125
  65. -1.26129 -0.274261
  66. -0.570305 -0.295527
  67. -0.182373 -0.0410972
  68. -0.213648 -0.12244
  69. julia> @einsum A[i,j,k] = X[i,r]*Y[j,r]*Z[k,r]
  70. 5×6×7 Array{Float64,3}:
  71. [:, :, 1] =
  72. -0.140556 0.134027 0.179899 0.627755 0.0996249 -0.0442743
  73. 0.738739 -0.442911 -0.0251791 -0.30159 0.201178 0.748148
  74. -0.222257 0.173872 0.150518 0.556337 0.052044 -0.145031
  75. -1.15216 0.804416 0.439202 1.77305 0.00119409 -0.942843
  76. 0.356423 -0.231037 -0.0731852 -0.344323 0.0489952 0.326778
  77. [:, :, 2] =
  78. 0.397202 -0.330261 -0.337728 -1.21813 -0.147139 0.220694
  79. -1.5599 0.968069 0.168698 1.01314 -0.333819 -1.51507
  80. 0.551277 -0.410494 -0.300243 -1.14183 -0.0715246 0.400667
  81. 2.66219 -1.84344 -0.96114 -3.92197 0.0395199 2.20862
  82. -0.787613 0.517985 0.187925 0.846224 -0.0876327 -0.70743
  83. [:, :, 3] =
  84. -0.997453 0.443513 -0.509762 -1.36396 -0.699856 -1.3147
  85. -0.281771 -0.174709 -1.19977 -3.82422 -1.02915 -0.962687
  86. -0.773218 0.387471 -0.241501 -0.55681 -0.42151 -0.933083
  87. -1.96108 1.20951 0.185581 1.18738 -0.440543 -1.91956
  88. 0.230419 -0.2273 -0.321604 -1.11604 -0.184337 0.0576331
  89. [:, :, 4] =
  90. -0.317672 0.0605948 -0.446202 -1.35898 -0.446433 -0.577685
  91. -0.967509 0.416021 -0.544352 -1.48553 -0.718138 -1.30317
  92. -0.118501 -0.0110862 -0.28501 -0.89313 -0.259904 -0.281897
  93. 0.362986 -0.329663 -0.406649 -1.43245 -0.211652 0.146789
  94. -0.291903 0.152008 -0.0710035 -0.144515 -0.143245 -0.34096
  95. [:, :, 5] =
  96. -0.0667018 -0.0249559 -0.226291 -0.717264 -0.198165 -0.195562
  97. -0.6132 0.307691 -0.190091 -0.436916 -0.333152 -0.73918
  98. 0.0347997 -0.0651548 -0.157056 -0.521917 -0.113275 -0.0520544
  99. 0.537557 -0.403173 -0.302962 -1.1466 -0.0777703 0.384987
  100. -0.231936 0.136746 -0.000229789 0.0681898 -0.0695689 -0.239447
  101. [:, :, 6] =
  102. -0.0452868 0.00832171 -0.0647238 -0.197362 -0.06452 -0.0829776
  103. -0.141371 0.0611584 -0.0782386 -0.212824 -0.103909 -0.189689
  104. -0.0163919 -0.00210828 -0.0414473 -0.130132 -0.0375447 -0.0401267
  105. 0.0556227 -0.0498019 -0.0597991 -0.211314 -0.0304527 0.0239016
  106. -0.0430469 0.0225507 -0.00999881 -0.0197739 -0.0207526 -0.0500169
  107. [:, :, 7] =
  108. -0.0197261 -0.0129295 -0.0864512 -0.275731 -0.0739839 -0.0687722
  109. -0.241735 0.123445 -0.0673792 -0.147621 -0.125382 -0.287166
  110. 0.019081 -0.0285214 -0.0607641 -0.203596 -0.0421448 -0.0143435
  111. 0.226918 -0.168415 -0.12164 -0.463661 -0.0279081 0.166014
  112. -0.0937235 0.0558792 0.00209385 0.0346776 -0.0263901 -0.0955337

在上面这个案例中,我们事先定义好了一个张量A用于存放计算结果,如果我们不事先定义的话,就需要按照以下示例来使用:

  1. julia> @einsum B[i,j,k] := X[i,r]*Y[j,r]*Z[k,r]
  2. 5×6×7 Array{Float64,3}:
  3. [:, :, 1] =
  4. -0.140556 0.134027 0.179899 0.627755 0.0996249 -0.0442743
  5. 0.738739 -0.442911 -0.0251791 -0.30159 0.201178 0.748148
  6. -0.222257 0.173872 0.150518 0.556337 0.052044 -0.145031
  7. -1.15216 0.804416 0.439202 1.77305 0.00119409 -0.942843
  8. 0.356423 -0.231037 -0.0731852 -0.344323 0.0489952 0.326778
  9. [:, :, 2] =
  10. 0.397202 -0.330261 -0.337728 -1.21813 -0.147139 0.220694
  11. -1.5599 0.968069 0.168698 1.01314 -0.333819 -1.51507
  12. 0.551277 -0.410494 -0.300243 -1.14183 -0.0715246 0.400667
  13. 2.66219 -1.84344 -0.96114 -3.92197 0.0395199 2.20862
  14. -0.787613 0.517985 0.187925 0.846224 -0.0876327 -0.70743
  15. [:, :, 3] =
  16. -0.997453 0.443513 -0.509762 -1.36396 -0.699856 -1.3147
  17. -0.281771 -0.174709 -1.19977 -3.82422 -1.02915 -0.962687
  18. -0.773218 0.387471 -0.241501 -0.55681 -0.42151 -0.933083
  19. -1.96108 1.20951 0.185581 1.18738 -0.440543 -1.91956
  20. 0.230419 -0.2273 -0.321604 -1.11604 -0.184337 0.0576331
  21. [:, :, 4] =
  22. -0.317672 0.0605948 -0.446202 -1.35898 -0.446433 -0.577685
  23. -0.967509 0.416021 -0.544352 -1.48553 -0.718138 -1.30317
  24. -0.118501 -0.0110862 -0.28501 -0.89313 -0.259904 -0.281897
  25. 0.362986 -0.329663 -0.406649 -1.43245 -0.211652 0.146789
  26. -0.291903 0.152008 -0.0710035 -0.144515 -0.143245 -0.34096
  27. [:, :, 5] =
  28. -0.0667018 -0.0249559 -0.226291 -0.717264 -0.198165 -0.195562
  29. -0.6132 0.307691 -0.190091 -0.436916 -0.333152 -0.73918
  30. 0.0347997 -0.0651548 -0.157056 -0.521917 -0.113275 -0.0520544
  31. 0.537557 -0.403173 -0.302962 -1.1466 -0.0777703 0.384987
  32. -0.231936 0.136746 -0.000229789 0.0681898 -0.0695689 -0.239447
  33. [:, :, 6] =
  34. -0.0452868 0.00832171 -0.0647238 -0.197362 -0.06452 -0.0829776
  35. -0.141371 0.0611584 -0.0782386 -0.212824 -0.103909 -0.189689
  36. -0.0163919 -0.00210828 -0.0414473 -0.130132 -0.0375447 -0.0401267
  37. 0.0556227 -0.0498019 -0.0597991 -0.211314 -0.0304527 0.0239016
  38. -0.0430469 0.0225507 -0.00999881 -0.0197739 -0.0207526 -0.0500169
  39. [:, :, 7] =
  40. -0.0197261 -0.0129295 -0.0864512 -0.275731 -0.0739839 -0.0687722
  41. -0.241735 0.123445 -0.0673792 -0.147621 -0.125382 -0.287166
  42. 0.019081 -0.0285214 -0.0607641 -0.203596 -0.0421448 -0.0143435
  43. 0.226918 -0.168415 -0.12164 -0.463661 -0.0279081 0.166014
  44. -0.0937235 0.0558792 0.00209385 0.0346776 -0.0263901 -0.0955337

这里我们可以发现,julia的变量定义形式跟python是类似的,并不需要事先声明变量的具体类型。

基本用法示例

在上面一个案例中我们执行了一个简单的功能测试,并介绍了julia的包的安装,这里我们再介绍一下julia语言的一些基本用法。

函数

最常用的julia的函数功能也是一个挺有意思的定义方法,我们可以直接对函数进行赋值来使用:

  1. julia> ∑(x,y)=x+y
  2. (generic function with 1 method)
  3. julia> ∑(3,5)
  4. 8

这里我们就定义了这样的一个函数。顺带一说,这些常见的希腊字母在julia中可以先按照latex的语法来写,然后Tab一下就可以弹出来具体字符。比如实际上是\sum<Tab>

注释

关于julia的注释没有太多好说的,单行注释跟python的一致,多行注释是#= comments =#这样的结构(空格是非必须的):

  1. julia> # This is a comment!
  2. julia> #= Test comment line1;
  3. Test comment line2 =#
  4. julia> #=Test comment line1
  5. Test comment line2=#

jl文件的执行

跟python的py文件类似的,julia可以将代码写入一个jl文件,再通过julia module.jl这样的形式来调用:

  1. [dechin-root julia]# echo 'println("Hello World!")' > helloworld.jl
  2. [dechin-root julia]# julia helloworld.jl
  3. Hello World!

调用python函数

通过PyCall这个包,我们可以在julia内部调用python代码。而类似于上述章节中的Einsum,这里我们也需要用Pkg来安装一下这个包:

  1. julia> import Pkg
  2. julia> Pkg.add("PyCall")
  3. Updating registry at `~/.julia/registries/General`
  4. Resolving package versions...
  5. Installed VersionParsing v1.2.0
  6. Installed Parsers ──────── v1.0.16
  7. Installed Conda ────────── v1.5.1
  8. Installed MacroTools ───── v0.5.6
  9. Installed PyCall ───────── v1.92.2
  10. Installed JSON ─────────── v0.21.1
  11. Updating `~/.julia/environments/v1.5/Project.toml`
  12. [438e738f] + PyCall v1.92.2
  13. Updating `~/.julia/environments/v1.5/Manifest.toml`
  14. [8f4d0f93] + Conda v1.5.1
  15. [682c06a0] + JSON v0.21.1
  16. [1914dd2f] + MacroTools v0.5.6
  17. [69de0a69] + Parsers v1.0.16
  18. [438e738f] + PyCall v1.92.2
  19. [81def892] + VersionParsing v1.2.0
  20. Building Conda ─→ `~/.julia/packages/Conda/tJJuN/deps/build.log`
  21. Building PyCall `~/.julia/packages/PyCall/tqyST/deps/build.log`

安装成功后,可以按照如下方法引入一个python的函数来执行计算任务:

  1. julia> using PyCall
  2. [ Info: Precompiling PyCall [438e738f-606a-5dbb-bf0a-cddfbfd45ab0]
  3. julia> math = pyimport("math")
  4. PyObject <module 'math' from '/home/dechin/anaconda3/lib/python3.8/lib-dynload/math.cpython-38-x86_64-linux-gnu.so'>
  5. julia> math.sin(math.pi / 4)
  6. 0.7071067811865475

这里可以看到我们调用python中的math函数计算了一个正弦函数值。

macro装饰器

macro是julia语言中的一个关键字,这里还不知道怎么去翻译它,在我们上一个章节张量网络的示例中其实已经用到了这个功能。说起来功能是类似于python中的装饰器(decorator)的概念,相关介绍可以参考前面写的这篇博客,以及一个python实现的装饰器实例。其实基本概念是跟模块化编程相关的,通过向上封装的方法丰富了接口调用的方法。macro的官方示例如下:

  1. julia> macro sayhello(name)
  2. return :( println("Hello, ", $name, "!") )
  3. end
  4. @sayhello (macro with 1 method)
  5. julia> @sayhello "Charlie"
  6. Hello, Charlie!

总结概要

在这篇文章中我们介绍了julia编程语言的一些基本特点,这是一门兼顾了高性能与高效开发的编程语言,而且开源免费。不仅具备有python的便捷性,还有接近于C语言的高性能特性,是一门为科学计算而生的编程语言。我们介绍了其在Manjaro Linux平台下的安装方法,及其基本使用方法,如变量定义、函数定义和调用、包的管理以及与python编程语言的协同工作。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/julia.html

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

参考链接

  1. https://zhuanlan.zhihu.com/p/52487166
  2. https://cn.julialang.org/JuliaZH.jl/latest/manual/getting-started/
  3. https://www.runoob.com/w3cnote/open-source-license.html
  4. https://blog.csdn.net/hetengjiao523/article/details/106397332

为科学计算而生的Julia——基于Manjaro Linux的安装与入门的更多相关文章

  1. 阿里重磅开源首款自研科学计算引擎Mars,揭秘超大规模科学计算

    日前,阿里巴巴正式对外发布了分布式科学计算引擎 Mars 的开源代码地址,开发者们可以在pypi上自主下载安装,或在Github上获取源代码并参与开发. 此前,早在2018年9月的杭州云栖大会上,阿里 ...

  2. 【Anaconda】:科学计算的Python发行版

    [背景] Python易用,但包管理和Python不同版本的问题比较头疼,特别是当你使用Windows的时候.为了解决这些问题,有不少发行版的Python,比如WinPython.Anaconda等, ...

  3. Anaconda 科学计算环境与包的管理

    相信大多数 python 的初学者们都曾为开发环境问题折腾了很久,包管理和 python 不同版本的问题,特别是 window 环境安装个 scrapy 各种报错 ,使用 Anaconda 可以很好的 ...

  4. windows下如何快速优雅的使用python的科学计算库?

    Python是一种强大的编程语言,其提供了很多用于科学计算的模块,常见的包括numpy.scipy.pandas和matplotlib.要利用Python进行科学计算,就需要一一安装所需的模块,而这些 ...

  5. Julia语言:让高性能科学计算人人可用

    Julia语言:让高性能科学计算人人可用要:一群科学家对现有计算工具感到不满:他们想要一套开源系统,有C的快速,Ruby的动态,Python的通用,R般在统计分析上得心应手,Perl的处理字符串处理, ...

  6. julia,集Python、C++、R为一体!Julia 1.0重磅发布, MIT发布史上最强科学计算编程语言?创始人独家解答11个问题

    这个编程语言的新版本之所以受到整个人工智能界的关注,最主要的原因正是其将 C 语言的速度.Ruby 的灵活.Python 的通用性前所未有地结合在一起,支持并行处理,易于学习和使用,尤其适合科学和工程 ...

  7. Anaconda 用于科学计算的 Python 发行版

    用于科学计算的 Python 发行版: 1.Anaconda  https://www.continuum.io/    公司continuum.  有商业版本. Anaconda is the le ...

  8. windows下安装python科学计算环境,numpy scipy scikit ,matplotlib等

    安装matplotlib: pip install matplotlib 背景: 目的:要用Python下的DBSCAN聚类算法. scikit-learn 是一个基于SciPy和Numpy的开源机器 ...

  9. Python科学计算——前期准备

    1.开发环境搭建 Python(英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公 ...

随机推荐

  1. O&#178; & O₂

    O² & O₂ special symbol O² & O₂ HTML HTML subscript and superscript Tags HTML 下标元素 HTML 上标元素 ...

  2. TypeScript & LeetCode

    TypeScript & LeetCode TypeScript In Action TypeScript 复杂类型 编写复杂的 TypeScript 类型 // 方法「只可能」有两种类型签名 ...

  3. taro 如何展示多行文本 省略号

    taro 如何展示多行文本 省略号 webkit-box-orient: vertical; See the Pen Pure CSS multiline text with ellipsis by ...

  4. nodejs 在windows10中设置动态(视频)壁纸

    github 项目地址 node版本 λ node -v v12.16.2 main.js const ffi = require("@saleae/ffi"); const ch ...

  5. 敏捷史话(七):从程序员、作家到摇滚乐手——Andy Hunt的多面人生

    与其说 Andy Hunt 是敏捷宣言的创始人,不如说他是一名专业作家来得更为合适.他的<实用程序员><程序员修炼之道:从小工到专家><编程 Ruby:实用程序员指南&g ...

  6. ElasticSearch 聚合分析

    公号:码农充电站pro 主页:https://codeshellme.github.io ES 中的聚合分析(Aggregations)是对数据的统计分析功能,它的优点是实时性较高,相比于 Hadoo ...

  7. CentOS7 安装 MySQL Cluster 7.6.7

    引用自:http://lemonlone.com/posts/mysql-ndb-cluster-install/ 仅做备份和配置文件更改 1.先在VMware中安装 CentOS-7-x86_64- ...

  8. 从客流统计到营销赋能,Re-ID加速实体商业数字化转型 | 爱分析洞见

    2020年中国实体商业受到突发疫情的重大影响.以危机为契机,实体商业加速数字化转型,利用创新应用服务自身业务.在此阶段,基于Re-ID(Person Re-identification,即行人再识别) ...

  9. Java Swing 自定义Dialog确认对话框

    Java Swing 自定义Dialog 需求:当点击JFrame窗口的关闭按钮时,弹框询问是否确定关闭窗口,如果是则关闭程序,否就让弹框消失什么也不做(使用Dialog). 分析:虽然Java提供了 ...

  10. CentOS7.8搭建STF

    安装命令插件(rz.sz): yum install -y lrzsz wget unzip zip编辑配置文件导致命令无法使用时:export PATH=/usr/local/sbin:/usr/l ...