只是对Bytestring和String做一些简单的基准测试.代码加载10,000,000行的文件,每行一个整数; 然后将每个字符串转换为整数.事实证明Prelude.read比慢得多ByteString.readInt.
我想知道效率低下的原因是什么.同时,我也不确定性能分析报告的哪一部分对应于加载文件的时间成本(数据文件大约为75 MB).
这是测试的代码:
import System.Environment
import System.IO
import qualified Data.ByteString.Lazy.Char8 as LC
main :: IO ()
main = do
xs <- getArgs
let file = xs !! 0
inputIo <- readFile file
let iIo = map readInt . linesStr $ inputIo
let sIo = sum iIo
inputIoBs <- LC.readFile file
let iIoBs = map readIntBs . linesBs $ inputIoBs
let sIoBs = sum iIoBs
print [sIo, sIoBs]
linesStr = lines
linesBs = LC.lines
readInt …Run Code Online (Sandbox Code Playgroud) 使用时pandas DataFrame,我可以to_string(float_format='%.1f')在DataFrame. 但是,当对 应用相同的方法时df.describe(),它失败了。
这个问题是不言自明的,代码如下。
>>> df = pd.DataFrame([[1, 2, 'March'],[5, 6, 'Dec'],[3, 4, 'April'], [0, 1, 'March']], columns=['a','b','m'])
>>> df
a b m
0 1 2 March
1 5 6 Dec
2 3 4 April
3 0 1 March
>>> df.to_string(float_format='%.1f')
u' a b m\n0 1 2 March\n1 5 6 Dec\n2 3 4 April\n3 0 1 March'
>>> df.describe().to_string(float_format='%.1f')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File …Run Code Online (Sandbox Code Playgroud) 这个关于Haskell的主题讨论了很多(例如可变数组实现),但我仍然不确定需要频繁修改和随机访问数组/向量的情况的最佳实践是什么.
说一个长度为1,000,000的向量.对其进行操作涉及基于输入访问其(小的,例如1000个)子集,并基于输入修改值.此外,这种操作重复2,000,000次.任务本身可以在纯数据结构中实现,例如列表,如下所示,尽管效率很低:
type Vect = [Int]
f :: Vect -> [[Int]] -> Vect
f x indsList = foldl g x indsList
-- g is just an example of random-access and modifications on the values.
g :: Vect -> [Int] -> Vect
g x inds = map h $ zip x [0..]
where h (x, i) = if i `elem` inds then x !! i + 1 else x !! i
Run Code Online (Sandbox Code Playgroud)
散列/映射数据结构(例如IntMap)可以用于有效的大量随机访问,但是数组/向量也应该这样做.更重要的是,仍需要通过可变结构来解决大量修改以避免存储器复制.Haskell中是否存在可变的随机访问数组/向量?如果使用ST/IO Monads,这些控件会影响我的设置吗?
函数喜欢sortBy并将unionBylambda函数作为参数.lambda函数通常在从列表元素中获取某些部分之后compare或eq之后执行.例如,
f v1 v2 = sortBy (\x y -> compare (fst x) (fst y)) $
unionBy (\x y -> (fst x) == (fst y)) (zip v1 [0..]) (zip v2 [0..])
Run Code Online (Sandbox Code Playgroud)
只是想知道lambda函数是否\x y -> compare (fst x) (fst y)可以更简洁地编写.
我目前正在使用此实现:
getVal = function(i, x, margin) {
rst = ifelse(margin==1, x[i, ], x[, i])
}
Run Code Online (Sandbox Code Playgroud)
即返回x的第i行OR列,具体取决于margin的值.
===更新===
刚刚意识到我ifelse(x,y,z)在这里使用语句是错误的,因为它返回的值与第一个参数的长度相同.我的实施getVal应该有:
...
rst = if (margin == 1) x[i, ] else x[, i]
...
Run Code Online (Sandbox Code Playgroud) 例如,输入:
line1 col1-1 http://www.google.com/index.html col3-1 col4 col5 col6 col7 col8
line2 col1-2 https://user:pwd@www.facebook.com/pp/index.html col3-2 col4 col5 col6 col7 col8
line3 col1-3 badColumn col3-3 col4 col5 col6 col7 col8
Run Code Online (Sandbox Code Playgroud)
应该结果
line1 col1-1 http://www.google.com col3-1 col4 col5 col6 col7 col8
line2 col1-2 https://www.facebook.com col3-2 col4 col5 col6 col7 col8
line3 col1-3 badColumn col3-3 col4 col5 col6 col7 col8
Run Code Online (Sandbox Code Playgroud)
有可能用awk一个线性(sub和regex?)来实现它.否则,你将如何在bash中实现它?