和Max一样,我强烈的怀疑是Go的迟缓与I/O性能差有关。我测试了这个假设:
package main
import "fmt"
import "os"
import "time"
func main(){
now := time.Now()
input,_ := os.Open("testing/test_cases.txt")
defer input.Close()
output,_ := os.Create("testing/Goutput.txt")
defer output.Close()
var ncases int
var p float64
fmt.Fscanf(input,"%d",&ncases)
fmt.Println("Opened files in ", time.Since(now), "seconds")
now = time.Now()
cases := make([]float64, ncases)
fmt.Println("Made array in ", time.Since(now), "seconds")
now = time.Now()
for i := 0; i < ncases; i++ {
fmt.Fscanf(input,"%f",&cases[i])
}
fmt.Println("Read data in ", time.Since(now), "seconds")
now = time.Now()
for i := 0; i < ncases; i++ {
p = cases[i]
if p >= 0.5 {
cases[i] = 10000 * (1-p) * (2*p-1) + 10000
} else {
cases[i] = p*(1-2*p)*10000 + 10000
}
}
fmt.Println("Processed data in ", time.Since(now), "seconds")
now = time.Now()
for i := 0; i < ncases; i++ {
fmt.Fprintln(output, cases[i])
}
fmt.Println("Output processed data in ", time.Since(now), "seconds")
}
运行它产生这样的输出:
Opened files in 2.011228ms seconds
Made array in 109.904us seconds
Read data in 4.524544608s seconds
Processed data in 10.083329ms seconds
Output processed data in 1.703542918s seconds
所以看来我的机器上,所有的数学在10ms左右出现,但I/O是缓慢的,证实了这个假设。正如Janne在评论中指出的那样,有可能比fmt
更快。
更新:例如,包装input
和output
与bufio
的读者和作家:使用binput
和boutput
用于缓冲I/O,你原来的版本2.1秒运行一次就
binput := bufio.NewReader(input)
boutput := bufio.NewWriter(output)
和我机器,比Python 2.7稍快。
更新2:我注意到,通过切换到缓冲I/O,我得到了不同的结果。
事实证明,您还需要调整您的格式字符串包括\n
,当你在C版本做。我认为这种方式实际上更为正确,但看起来你可以在没有缓冲的情况下摆脱它。
这对你的缓冲输出也是很重要的,我曾经做过但之前没有提到过。
这里是我完整的缓冲溶液:
package main
import "fmt"
import "os"
import "bufio"
import "time"
func main(){
now := time.Now()
nbinput, _ := os.Open("testing/test_cases.txt")
defer nbinput.Close()
nboutput, _ := os.Create("testing/Goutput.txt")
defer nboutput.Close()
binput := bufio.NewReader(nbinput)
boutput := bufio.NewWriter(nboutput)
var ncases int
var gain, p float64
fmt.Fscanf(binput,"%d\n",&ncases)
for i := 0; i < ncases; i++ {
fmt.Fscanf(binput, "%f\n", &p)
if p >= 0.5 {
gain = 10000 * (1-p) * (2*p -1)
} else {
gain = p*(1-2*p)*10000
}
fmt.Fprintln(boutput, gain+10000)
}
boutput.Flush()
fmt.Println("Took ", time.Since(now), "seconds")
}
相关转到问题:[大UTF-8字符串的快速扫描(http://stackoverflow.com/q/14924598/222914) –