作为编程挑战的一部分,我需要从stdin读取一系列空格分隔的整数(在一行上),并将这些整数的总和打印到stdout.有问题的序列可以包含多达10,000,000个整数.
我有两个解决方案:一个用Haskell(foo.hs
)编写,另一个用等价的,用Python 2(foo.py
)编写.不幸的是,(编译的)Haskell程序一直比Python程序慢,而且我不知道解释两个程序之间的性能差异; 请参阅下面的基准部分.如果有的话,我会期望Haskell占上风......
我究竟做错了什么?我如何解释这种差异?有没有一种简单的方法来加速我的Haskell代码?
(有关信息,我使用的是2010年中期的Macbook Pro,配备8Gb RAM,GHC 7.8.4和Python 2.7.9.)
foo.hs
main = print . sum =<< getIntList
getIntList :: IO [Int]
getIntList = fmap (map read . words) getLine
Run Code Online (Sandbox Code Playgroud)
(编译ghc -O2 foo.hs
)
foo.py
ns = map(int, raw_input().split())
print sum(ns)
Run Code Online (Sandbox Code Playgroud)
在下文中,test.txt
由一行1000万个以空格分隔的整数组成.
# Haskell
$ time ./foo < test.txt
1679257
real 0m36.704s
user 0m35.932s
sys 0m0.632s
# Python
$ time python foo.py < test.txt
1679257
real 0m7.916s
user …
Run Code Online (Sandbox Code Playgroud) 我正在使用git-for-windows Git Bash.我无法在命令行上运行可执行文件:
Pedr@Abc-07 MINGW64 /c/dev
$ ls sqlite3.exe
sqlite3.exe*
Pedr@Abc-07 MINGW64 /c/dev
$ sqlite3
bash: sqlite3: command not found
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
我创建了一个分支来尝试不同的方法并且它有效,所以我想将"Farmcrops"分支合并为"Master"以保持这些变化,但继续"Farmcrops"分支以探索另一种可能性.这样,如果这个最新的改变不起作用,我可以回到"大师",现在包括第一轮改变.
我怎样才能做到这一点?
我是Git的新用户.我已经分叉了一个名为Spoon-Knife的存储库(可以用Git练习分叉).然后,我通过运行在本地克隆它
git clone https://github.com/rohinichoudhary/Spoon-Knife.git
Run Code Online (Sandbox Code Playgroud)
该存储库包含三个分支,即
master
,test-branch
,change-the-title
.当我跑git branch
,它只显示*master
,而不是剩下的两个分支.当我跑
git checkout test-branch
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
错误:pathspec'test-branch'与git已知的任何文件都不匹配.
为什么会这样?我怎么解决这个问题?
我有Git(版本1.7.2.5)bash compeletion正在处理我的Debian squeeze(6.0).Git安装了aptitude,我正在使用标准的debian bash
,它支持命令行自动完成.
现在,我刚刚在另一台机器(Lenny/Debian 5.0)上安装了Git(1.5.6.5),并且没有自动完成功能.
为什么Git自动完成不能在第二台机器上运行?我该如何诊断?
什么使我的机器完成工作?我已经查找了该文件,git-completion.bash
但它似乎不在我的机器上.Git如何完成工作?
如何将git完成到另一台机器上?
(全部在Windows 8上以poshgit完成):
git init --bare test-repo.git
cd test-repo.git
Run Code Online (Sandbox Code Playgroud)
(文件夹是使用git-ish文件和文件夹创建的)
git status
Run Code Online (Sandbox Code Playgroud)
致命:这个操作必须在工作树中运行 (好吧,所以我不能使用git状态和一个简单的仓库;我猜是有道理的)
git branch
Run Code Online (Sandbox Code Playgroud)
(没什么,似乎裸仓库不包含任何分支.我是否必须从克隆的仓库中添加它们?)
cd ..
mkdir test-clone
cd test-clone
git clone ../test-repo.git
Run Code Online (Sandbox Code Playgroud)
(我收到有关克隆空存储库的警告)
cd test-repo
Run Code Online (Sandbox Code Playgroud)
(提示更改以指示我在主分支上)
git branch
Run Code Online (Sandbox Code Playgroud)
(显示没有结果 - 是吗?)
git branch master
Run Code Online (Sandbox Code Playgroud)
致命的:不是有效的对象名称:'master'
嗯.那么如何在我的裸仓库中创建主分支?
据我所知,术语"分支"(用Git的说法)可能指的是相关但不同的东西:
但是,我已经看到这个术语过去常常是指三种可能的用法以外的东西(下面有更多细节).在Git上下文中,我的列表中缺少的"分支"一词是否还有其他有效和明确的用法?
使用Git大约一年后,我正在为CS学生准备一个简短的教程.我真的想要确定Git术语,以避免任何混淆.
当然,我现在已经使用Git分支了一段时间; 我很习惯使用它们并且发现Git分支模型很棒.但是,我仍然发现术语"分支"有问题且含糊不清,因为它似乎至少引用了两个不同的东西,具体取决于它所使用的上下文...有时甚至在同一个教程/手册中.
Pro Git书(3.1中 - 分支是什么),在显示下图后,
继续将分支定义为
只是一个指向其中一个提交的轻量级可移动指针.
据我所知,这也是Git手册页中"分支"的含义.
我对这个定义非常满意.我认为分支只是指向DAG中特定提交的引用,而分支的"提示提交"是该引用指向的提交.到现在为止还挺好.可是等等...
该Atlassian的Git的教程介绍分支如下:
分支代表独立的发展路线.
我猜他们的意思是一串提交.让我改进一下这个想法......唯一对我有意义的解释是术语"分支"也可以指存储库的提交DAG的子图,该提交DAG由所考虑的提示提交可到达的所有提交组成.
但是,Pro Git书籍也包含以下图表(参见3.4 - 分支工作流程),
这似乎与我的解释相矛盾,因为它似乎暗示只有提交C2
- C5
(不C1
)属于develop
分支,并且只提交C6
- C7
(不是C1
- C5
)属于topic
分支.
我发现这种用法含糊不清,因为如果我在那个阶段绘制DAG,而不知道分支引用在过去指向的位置,并且没有任何假设三个分支之间的任何层次结构,我会得到的是
我还发现其他Git学习资源中的一些图表令人困惑.特别考虑以下内容(取自Lynda.com的介绍视频- Git Essential Training):
这里,尖端master
是实际 534de
(和HEAD
指向master
),但图中的"主"标签的位置是非常误导.在这种情况下,该标签应该描述的是我不清楚的......
编辑:我已经 …
如何获取2014-01-01和2014-06-30之间对主分支所做的所有git提交的列表?
我知道git log
会给我大致这种格式(对所有提交重复):
commit <hash>
author: <author name>
date: <date>
<comment>
Run Code Online (Sandbox Code Playgroud)
但是如何将其限制为选定日期和每个提交格式一行?
<hash> <author> <date>
<hash> <author> <date>
Run Code Online (Sandbox Code Playgroud) 为什么即使我在运行后没有对提交(消息,文件)进行任何更改,我最新提交的SHA-1哈希值也会发生变化git commit --amend
?
假设我在命令行运行以下命令.
cd ~/Desktop
mkdir test_amend
cd test_amend
git init
echo 'foo' > test.txt
git add test.txt
git commit -m 'initial commit'
Run Code Online (Sandbox Code Playgroud)
然后,调用
git log --pretty=oneline --abbrev-commit
Run Code Online (Sandbox Code Playgroud)
打印以下消息:
b96a901 initial commit
Run Code Online (Sandbox Code Playgroud)
然后我做
git commit --amend
Run Code Online (Sandbox Code Playgroud)
但我改变主意,决定不改变最后一次提交中的任何内容.换句话说,我保持最后一次提交的文件,目录和消息不变(我只保存消息文件并关闭我的编辑器).
然后,我做
git log --pretty=oneline --abbrev-commit
Run Code Online (Sandbox Code Playgroud)
再一次,我看到提交的哈希值发生了变化:
3ce92dc initial commit
Run Code Online (Sandbox Code Playgroud)
是什么导致哈希改变?是否与提交的时间戳有关?