Enjoy Elixir #007 Flow

12085 단어 Elixir

소개



  • KFIE이라는 킨키 대학 산업 이공 학부의 정보계 커뮤니티가 있습니다.
  • 요즘은 매주 화요일에 LT회를 하고 있다고 합니다
  • 제가 학생이었던 것은 이미 옛날이지만 참가하게되었습니다.
  • 매주, 5분간 시간을 받고, Elixir 좋아! 말을 전하고 싶다고 생각합니다.
  • 2020/7/14(화)의 회

  • 오늘은 다음을 배웁니다.
  • Flow

  • A journey of a thousand miles begins with a single step.



  • 모쿠지



    Elixir
    |> 001 mix new, iex -S mix, mix format
    |> 002형
    |> 003 패턴 매칭
    |> 004 Modules and functions
    |> 005 Pipe operator and Enum module
    |> 006 HTTP GET!
    |> 007 Flow
    |> 008 AtCoder를 풀어보기

    준비


    $ mix new hello_flow
    $ cd hello_flow
    

    종속성 해소


  • 999 Where to go next

  • Flow allows developers to express computations on collections, similar to the Enum and Stream modules, although computations will be executed in parallel using multiple GenStages.

    mix.exs
      defp deps do
        [
          {:flow, "~> 1.0"}
        ]
      end
    
    $ mix deps.get
    

    플로우를 잡지 않고 단어 수를 세어보십시오.



    lib/word_count.ex
    defmodule WordCount do
      @path "testfile.txt"
    
      def run do
        File.stream!(@path)
        |> Enum.flat_map(&String.split(&1, " "))
        |> Enum.map(&String.trim/1)
        |> Enum.reduce(%{}, fn word, acc ->
          Map.update(acc, word, 1, &(&1 + 1))
        end)
      end
    end
    
  • testfile.txtFlow 로 만들었습니다

  • Faker 을 이용했습니다
  • Faker::TvShows::SiliconValley


  • 실행


    $ curl -o testfile.txt https://firebase.torifuku-kaiou.tokyo/testfile.txt
    
    $ iex -S mix
    
    iex> :timer.tc WordCount, :run, []
    {21064536,
     %{
       "Russ" => 19354,
       "whole" => 18160,
       "prove" => 18346,
     ...
     }}
    

    Flow를 사용하여 단어 수를 계산



    lib/word_count.ex
    defmodule WordCount do
      @path "testfile.txt"
    
      def run_with_flow do
        File.stream!(@path)
        |> Flow.from_enumerable()
        |> Flow.partition()
        |> Flow.flat_map(&String.split(&1, " "))
        |> Flow.map(&String.trim/1)
        |> Flow.reduce(fn -> %{} end, fn word, acc ->
          Map.update(acc, word, 1, &(&1 + 1))
        end)
        |> Enum.into(%{})
      end
    end
    

    실행


    iex> recompile
    
    iex> :timer.tc WordCount, :run_with_flow, []
    {7952146,
     %{
       "Russ" => 19354,
       "whole" => 18160,
       "prove" => 18346,
     ...
     }}
    
    iex> 7952146 / 21064536
    0.37751346623538257
    
  • 처리 시간이 빨라지고 있습니다


  • Wrapping Up


  • 오늘의 포인트는 실리콘 밸리을 사용하면 빨라집니다
  • 엄청 난폭하게 말하지만, Flow 으로 쓴 프로그램을 어쨌든 Enum
  • 다음 번에는 Flow
  • 다음 주를 기다릴 수 없는 분은, 자원이나 커뮤니티의 정보를 AtCoder를 풀어보십시오. 에 정리하고 있으므로 다이브 해 주세요!

  • Enjoy!!!
  • 좋은 웹페이지 즐겨찾기