github 提交 - gonum - floats.Norm()

收錄在 Ameba 的一百篇

--
gonum floats Norm - vector dot product 這篇發現 Norm 做法有點慢,
做了個實驗

在這本 The GO Programming Language 
第十一章 特別介紹了 Testing, 有點像 Java Unit Test
可以撰寫該 package 相關的 測試程式
並在 11.4 介紹了如何做 Benchmark
果然 GO 不虧是 21 世紀的 C 語言

首先先看一下 vector normalization
floats.go

原先做法:

可以發現, 它利用 math.Hypot() 這個函式.
每次把前次結果做平方, 加上新的 s[i] 平方值, 又再做開根號

我們試寫一個新的做法看看
很簡單, 先把各 s[i] 平方值 總合起來後, 再做 開根號

驗證:

   Go 的 Test 程式 - floats_test.go



   GO 會抓 檔名 *_test.go 中 func Test<Name>(t *testing.T) 來執行
  並用 t.Error() 回報錯誤, ( t.Errorf() 類似 Printf, 可以設定 format )

   執行只要在該目錄下, 跑 "go test" 即可
   結果:
       PASS
       OK    <執行目錄.>     0.002s

Benchmark : benchmark_test.go
 

檔案名稱同樣是用 _test.go 結尾, function 格式是 func Benchmark<name>(b *testing.B)

可以用 -bench= 來指定要跑的 benchmark function, 如果用 -bench=. 則會抓所有 package 中的 benchmark functions.

特別的是 for loop b.N 次數, 會用總共一秒鐘的時間來取得需要的次數

執行: $ go test -bench=.
結果:
    goos:  linux
    goarch: amd64
    BenchmarkNorm-4        30606816        36.5 ns/op
    BenchmarkNorm1-4      168108007       7.16 ns/op
    PASS
    OK                _<目錄>                            3.089s

這邊 -4 代表目前 CPU 有幾核心, 也就是 GOMAXPROCS

可以發現我們修改後的方法, 比原本的快了5倍

===
github 提交

這作法是在 gonum 這個項目 - https://github.com/gonum/gonum

我們來提交看看.

1. 首先先 fork 一個到自己的 github : https://github.com/neojou/gonum
2. 在自己工作電腦上, git clone https://github.com/neojou/gonum
3. 修改 gonum/floats/floats.go
4. go test 看看
    發現 會錯,
    --- FAIL: TestDistance (0.00s)
         floats_test.go:265: Distance does not match norm for case 1, 2. Expected 16.627687752661224, Found 16.62768775266122.
    FAIL
    exit status 1
    FAIL      gonum.org/v1/gonum/floats     0.005s

    看了一下, 我們把 floats.go 中 Distance() 裡計算方式也改成我們的方式

5. git add floats/floats.go

6. git commit -s
    寫完後可以用 git log 看一下

7. git push
    把修改上傳到自己的 github
    這時候可以再看一下有沒有要修改的, 有的話
    git commit --amend
    git pull
    git push

8. pull request
    https://help.github.com/en/articles/creating-a-pull-request-from-a-fork
    到原本的 gonum 按 New Pull Request
    不過我前面 git commit 沒弄好, 想修改描述, 結果變成 3個 commit...
    https://github.com/gonum/gonum/pull/1131


後續:
https://njiot.blogspot.com/2019/10/github-gonum-blas-norm.html




留言

熱門文章