的确是很快,不服不行:
go
/*/
注意:
1.需要编译为c的动态库
go build -buildmode=c-shared -o libcfunc.so cfunclib.go
2.导出的函数必须用 "//export funcname"的方式 //和export之间不能有空白
/*/
package main
import (
"C"
"log"
)
//export sum_n
func sum_n(num int) int {
//计算 的和
log.Printf("num: %d\n", num)
var sum int
for i := 0; i < num; i++ {
sum += i
}
log.Printf("sum: %d\n", sum)
return sum
}
//export stradd
func stradd(a, b *C.char) *C.char {
merge := C.GoString(a) + C.GoString(b)
log.Printf("merge: %s\n", merge)
return C.CString(merge)
}
func main() {
}
python
import ctypes
import time
dll = ctypes.CDLL("./libcfunc.so")
addstr = dll.stradd
# 转化为正确的类型
addstr.argtypes = [ctypes.c_char_p, ctypes.c_char_p]
addstr.restype = ctypes.c_char_p
a = 'test1 啊'.encode('utf-8')
b = ' 三left'.encode('utf-8')
c = addstr(a, b).decode('utf-8')
print(c)
# 对比测试go比python快了多少
go_sum_n = dll.sum_n
go_sum_n.restype = ctypes.c_long
py_sum_n = lambda x:sum(range(x))
btime = time.time()
gov = go_sum_n(1000000)
print("gov", gov, time.time()-btime)
btime = time.time()
pyv = py_sum_n(1000000)
print("pyv", pyv, time.time()-btime)
结果
[archusr@arch-dev standy_py]$ python uselib.py
2020/06/02 09:19:00 merge: test1 啊 三left
test1 啊 三left
2020/06/02 09:19:00 num: 1000000
2020/06/02 09:19:00 sum: 499999500000
gov 499999500000 0.0003707408905029297
pyv 499999500000 0.013869762420654297
不服,不行,啊,来个简单的
python
>>> int('ff'*8, 16)
18446744073709551615
>>> 18446744073709551615*18446744073709551615
340282366920938463426481119284349108225
>>>
go
package main
import (
//"fmt""log"
"os/exec"
"plugin"
"time"
//"github.com/influxdata/telegraf/plugins/inputs/system")
func main() {
a := 18446744073709551615
b := a * a
log.Printf("%d * %d = %d\n", a, a, b)
}
结果
[archusr@arch-dev src]$ go run test1.go
# command-line-arguments
./test1.go:13:4: constant 18446744073709551615 overflows int
./test1.go:24:3: undefined: calcor
好的,你的确是很快,(电影唐伯虎点秋香,我的船很快,沉也沉的很快)