Julia速度极慢

问题补充:在上次的基础上,如果我要匹配的字符不是[1:3],而是以冒号分割的第一个字段,则fn2函数需要再次使用 split,速度就会降下来,该如何解决?

这种时候就需要 findfirst 函数了,速度应该会比 split 两次快。

function uniq(path::String)
    count = 0
    function fn2(str)
        idx=findfirst(':',str)
        strs[1:idx] != "some string" && strs[1:idx] != "another string"
    end
    for line in eachline(path)
        if startswith(line,"##") == false
            datas = split(line,"\t")
            if any(fn2,datas)
                count += 1
            end
        end

    end
    count
end

确实,findfirst 很快,日常使用中,怎么发现这些有用的函数呢

多谢,确实简洁!

有好几种方法,都以 findfirst 为例吧。

  1. 看文档,建议把中文文档读完。主页 · Julia中文文档

  2. REPL 里面的 help 模式。根据我的需求,我要找以某个字符(或者字符串分割的第一个字段),那么关键词就是 find.于是我在 repl 里面输入 ?find得到

help?> find
search: findmin findmax findall findprev findnext findmin! findmax! findlast findfirst isdefined @isdefined significand firstindex finally finalize finalizer isfinite UndefInitializer fieldname fieldnames flipsign function Function functionloc

Couldn't find find
Perhaps you meant bind, sind, fill, fd, fld, Cint, asind, in, inv, min, rand, sin, sinc, sinh, tand, end, findall, findmax, findmin, fill!, first, fdio, fld1, fma, foldl, foldr, for, if, Inf, diff, @info, isinf, Main, @cmd, @simd, Cmd or Cuint
  No documentation found.

  Binding find does not exist.

虽然返回是 Binding find does not exist.
但是第一行 search:... 里面的 findfirst 是不是就是我们要找的呢。
同时我们还知道了有其他的函数,如 findmin findlast 等等。

  1. 搜索引擎,如果我知道 python 里面有个函数叫 findfirst, 我想知道 julia 里面有没有类似的, 那么我就可以搜索 julia findfirst.

  2. 平时积累。逛论坛的时候留意一下别人用的函数(鼓励多逛论坛),如 any all 我之前也不知道。

好的,另外我发了邮件给您,我没看出来哪里不对,好像没起到过滤作用

我之前写的代码只是为了说明用 findfirst 可以。但并不代表你可以不加修改地拿来用。举个栗子

julia> str="0/0:040444"
"0/0:040444"
julia> idx=findfirst(':',str)
4
julia> str[1:idx]
"0/0:"

不适合公开在论坛讨论的问题请寻求商业支持,不要发邮件。

我是新用户,论坛有回复数量限制,不得已为之 :blush:

今后有时间要学学markerdown,以及怎样规范地分享粘贴代码

看到VCF就知道楼主是生信狗 :blush:

搜索一下就能找到Julia里VCF相关的库 biojulia.net 。 不知道对你有用不。

好的,多谢,我知道这个库。最起初的目的只是打算用vcf 文件对比julia 和python 的速度,以及学习julia的优化,并非要解决实际中的问题。-----ps:感觉julia的交互环境很适合生物信息,读取文件,调用shell 也很方便

最后总结一下处理这个VCF文件的脚本,根据几位大神,不知道对不对:

function filter_line(file::String)
    function fn_map(str::AbstractString)
        i = findfirst(':', str)
        i == nothing && return false
        str[1:i-1] != "0/0" && str[1:i-1] != "./." && return true
    end
    
    for line in eachline(file)
        startswith(line, "##") && continue
        data = split(line, "\t")
        if all(fn_map, data[10:end])
            println(line)
        end
    end
end

file = ARGS[1]
filter_line(file)

你确定是all,不是any?
我觉得不应该在函数中定义函数,应该在函数中定义函数对象

fn_map = function fn_map(...)

对的,题主的意思应该要用any

有任意一个满足即可

这种有什么影响?

只是一种编程习惯

我感觉很奇怪阿,julia既然以性能著称并采用Jit,为什么还要刻意去不断的优化代码呢?看前面几位大神,从函数的选择,bool的判断等等都在优化,最后才比python快了那么一点。

事实上python也有它的Jit版的解释器, pypy就可以完全在不修改python代码的情况下,使其速度比cpython要快6倍以上。

其实需要大的数据量才能看出区别