Abstract

  • GitHub์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๋‹ค์šด๋กœ๋“œ๋˜๋Š” Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 200๊ฐœ๋ฅผ ๋Œ€์ƒ์œผ๋กœ, 5๊ฐœ ์ค‘ 1๊ฐœ์—๋Š” C์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.
  • ์ •์  ๋ถ„์„๊ธฐ๋Š” ๋‹จ์ผ ์–ธ์–ด์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๊ณ  Stub์„ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ํ•จ์ˆ˜ ๋™์ž‘์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ๋ถ„์„๊ธฐ์˜ soundness๋ฅผ ์•ฝํ™”์‹œํ‚จ๋‹ค.
  • ๋ณธ ์—ฐ๊ตฌ์—์„œ๋Š” C ํ™•์žฅ์„ ํ˜ธ์ถœํ•˜๋Š” Python ํ”„๋กœ๊ทธ๋žจ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” abstract interpretation์„ ํ†ตํ•ด ์ •์  ๋ถ„์„๊ธฐ๋ฅผ ์„ค๊ณ„ํ•œ๋‹ค.
  • ์ •์  ๋ถ„์„๊ธฐ๋Š” Python, C ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ณด๊ณ ํ•œ๋‹ค.

1. Introduction

  • host language๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด guest language๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. (==interface = boundary==)
  • guest language: C, ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ, ๋„ค์ดํ‹ฐ๋ธŒ C
  • host language: Python
  • ํŒŒ์ด์ฌ์—์„œ๋Š” ๊ธฐ๋ณธ C ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ํšจ์œจ์ ์ธ C ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” high-level ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • ์ด๋Š” ํšจ์œจ์ ์ด์ง€๋งŒ ์—ฌ๋Ÿฌ ๋ฒ„๊ทธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š”๋ฐ, ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์–‘ํ•œ ์•ˆ์ „ ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์‹์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
  • Python ๐Ÿ†š C
    • ํŒŒ์ด์ฌ์€ ์‹คํ–‰ ์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Exception ํ˜•ํƒœ๋กœ ์บก์Аํ™”๋˜์–ด ๋ณด๊ณ ๋˜์ง€๋งŒ, C ์ฝ”๋“œ ์˜์—ญ์—์„œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŒŒ์ด์ฌ์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์ด ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ๋„ ์ „์— ์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ(Hard crash)์‹œ์ผœ ๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค.
    • Representation: ํŒŒ์ด์ฌ ์ •์ˆ˜ ๊ฐ์ฒด๋Š” ์ตœ์†Œ 24๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  unlimited precision, C ์ •์ˆ˜๋Š” ๊ณ ์ •๋œ ๊ธธ์ด(์ผ๋ฐ˜์ ์œผ๋กœ 8~64๋น„ํŠธ ๋ฒ”์œ„)๋ฅผ ๊ฐ€์ง€๋ฉฐ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ •์ ๋ถ„์„๊ธฐ๋Š” Stub์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋Œ€ํ•œ ํ˜ธ์ถœ ๋™์ž‘์„ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ์— ์‹œ๊ฐ„ ์†Œ์š”๊ฐ€ ๋งŽ์ด ๋˜๊ณ  ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑด์ „์„ฑ๊ณผ ์ •ํ™•์„ฑ ์ธก๋ฉด์„ ํ›ผ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Mopsa๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„: ๋„ค์ดํ‹ฐ๋ธŒ C ์ฝ”๋“œ์™€ ํŒŒ์ด์ฌ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค. (๋„ค์ดํ‹ฐ๋ธŒ ๋‹จ์—์„œ ํŒŒ์ด์ฌ ์ฝ”๋“œ์— ๋Œ€ํ•œ callback ํฌํ•จ)
  • Abstract interpretation: precise, flow, and context-sensitive value analysis
  • Mopsa + Multilanguage C/Python ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ์ง€์› ์ถ”๊ฐ€ (boundary๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋„๋ฉ”์ธ์„ ์ถ”๊ฐ€)

Limitations

  • garbage collection ๋ฏธ์ง€์›: reference counting์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ garbage collection์€ ๋ณธ ์—ฐ๊ตฌ์˜ semantic์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ deallocation์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ๋‹ค. โ†’ ์ฐธ์กฐ ์นด์šดํŒ… ์˜ค๋ฅ˜(์กฐ๊ธฐ/์ง€์—ฐ ํ•ด์ œ) ํƒ์ง€ ๋ถˆ๊ฐ€
  • Lack of formal soundness proof: ๋ถ„์„ ๋„๊ตฌ๊ฐ€ ์„ค๊ณ„ํ•œ ๋…ผ๋ฆฌ ๋ชจ๋ธ์ด ์‹ค์ œ ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ(CPython)์˜ ๋™์ž‘๊ณผ 100% ์ผ์น˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์ฆ๋ช…ํ•˜์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธํƒ(FN)์˜ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค.
  • Builtins API ์‚ฌ๊ฐ์ง€๋Œ€: ๋ถ„์„์˜ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์ผ๋ถ€ ๋ณต์žกํ•œ API ๊ธฐ๋Šฅ์„ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ •์˜๋œ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๊ฐ„์ฃผํ•˜์—ฌ ์ฒ˜๋ฆฌ ๐Ÿ‘‰๐Ÿป API ์ž์ฒด ๊ตฌํ˜„๋ถ€์— ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ์ˆจ์–ด ์žˆ๋‹ค๋ฉด ๋ถ„์„ ๋„๊ตฌ๋Š” ์ด๋ฅผ ๊ฒ€์ฆํ•˜์ง€ ๋ชปํ•œ๋‹ค.
  • ์ผ๋ถ€ Python ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(pickle, sys.getsizeof ๋“ฑ) ๋ฏธ์ง€์›
  • ๋ณต์žกํ•œ ๋™์  ๋ฐฐ์—ดยทํฌ์ธํ„ฐ ๊ตฌ์กฐ์—์„œ C ๋ถ„์„ ์ •๋ฐ€๋„ ์ €ํ•˜

3. Methodology

3.1. Idea

  • Python C API๋ฅผ ๊ณต์‹ ๊ฒฝ๊ณ„๋กœ ์‚ผ์•„, ๊ฐ ์–ธ์–ด์˜ ์˜๋ฏธ๋ก ์„ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์œ ์ง€ํ•˜๋ฉด์„œ ๊ฒฝ๊ณ„ ์—ฐ์‚ฐ๋งŒ ๋ณ„๋„๋กœ ์ •์˜ํ•œ๋‹ค.
  • ํ•ต์‹ฌ ๊ฐ€์ •: C ์ฝ”๋“œ๋Š” Python ๋‚ด์žฅ ๊ฐ์ฒด์— API๋ฅผ ํ†ตํ•ด์„œ๋งŒ ์ ‘๊ทผํ•œ๋‹ค. API ํ˜ธ์ถœ์€ Python ์˜๋ฏธ๋ก ์œผ๋กœ ์œ„์ž„ ๊ฐ€๋Šฅ

3.2. Concrete Semantics

๊ฒฐํ•ฉ ์ƒํƒœ (Combined State)

์ƒํƒœ๊ตฌ์„ฑ ์š”์†Œ
Python ์ƒํƒœ ฮฃpํ™˜๊ฒฝ Ep (๋ณ€์ˆ˜โ†’์ฃผ์†Œ) + ํž™ Hp (์ฃผ์†Œโ†’๊ฐ์ฒด) + ํ๋ฆ„ ํ† ํฐ (cur / exn)
C ์ƒํƒœ ฮฃc๋ฉ”๋ชจ๋ฆฌ ์…€ Ec + ํž™ Hc (์ฃผ์†Œโ†’์ž์› ํƒ€์ž…ยทํฌ๊ธฐ)
๊ฒฐํ•ฉ ์ƒํƒœ ฮฃฮฃp ร— ฮฃc (์ฃผ์†Œ ๊ณต๊ฐ„ Addr ๊ณต์œ )
  • C์—์„œ PyType_GenericNew๋กœ ํ• ๋‹น๋œ ๊ฐ์ฒด โ†’ Python ๋ณ€์ˆ˜ c๊ฐ€ ํ•ด๋‹น ์ฃผ์†Œ๋ฅผ ์ง์ ‘ ์ฐธ์กฐ (๋ณต์‚ฌ ์—†์Œ)
  • PyAlloc ์ž์› ํƒ€์ž…์œผ๋กœ Python ๊ฐ์ฒด ๊ตฌ๋ถ„ โ†’ C๊ฐ€ ์ง์ ‘ ์ ‘๊ทผ ์‹œ ํƒ์ง€ ๊ฐ€๋Šฅ

๊ฒฝ๊ณ„ ํ•จ์ˆ˜ (Boundary Functions)

๋‘ ๋ฐฉํ–ฅ ๋ชจ๋‘ lazy & shallow ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • lazy: ์‹ค์ œ๋กœ ์–ธ์–ด๋ฅผ ๋„˜๋‚˜๋“œ๋Š” ๊ฐ์ฒด๋งŒ ๋ณ€ํ™˜
  • shallow: ์ด๋ฏธ ์ƒ๋Œ€ ํž™์— ๋“ฑ๋ก๋œ ์ฃผ์†Œ๋Š” ์žฌ๋ณ€ํ™˜ํ•˜์ง€ ์•Š์Œ
๋ฐฉํ–ฅํ•จ์ˆ˜์ฃผ์š” ๋™์ž‘
Python โ†’ Cp โ†ช cob_type ์ดˆ๊ธฐํ™”, PyAlloc์œผ๋กœ C ํž™์— ๋“ฑ๋ก, ํด๋ž˜์Šค๋ฉด PyType_Ready ํ˜ธ์ถœ
C โ†’ Pythonc โ†ช pPyAlloc ์—ฌ๋ถ€ ๊ฒ€์‚ฌ, ob_type์„ ์žฌ๊ท€์ ์œผ๋กœ Python ํž™์— ๋“ฑ๋ก

์–ธ์–ด ์ „ํ™˜ ์—ฐ์‚ฐ 3์ข…

โ‘  C call from Python (Python์ด C ํ•จ์ˆ˜ ํ˜ธ์ถœ)

in_check  โ†’  pโ†ชc(self, args)  โ†’  C ํ•จ์ˆ˜ ์‹คํ–‰  โ†’  out_check  โ†’  cโ†ชp(๋ฐ˜ํ™˜๊ฐ’)
  • in_check: ์ธ์Šคํ„ด์Šค ํƒ€์ž… ๊ฒ€์‚ฌ, ์‹คํŒจ ์‹œ TypeError
  • out_check: NULL ๋ฐ˜ํ™˜ โ†” ์˜ˆ์™ธ ์„ค์ • ์ผ๊ด€์„ฑ ๊ฒ€์‚ฌ, ๋ถˆ์ผ์น˜ ์‹œ SystemError

โ‘ก Python call from C (C์—์„œ Python ์ฝœ๋ฐฑ PyObject_CallObject)

cโ†ชp(f, args)  โ†’  Python ์˜๋ฏธ๋ก ์œผ๋กœ ์‹คํ–‰  โ†’  ์ •์ƒ์ด๋ฉด pโ†ชc(๊ฒฐ๊ณผ)
                                            โ†’  ์˜ˆ์™ธ ๋ฐœ์ƒ์ด๋ฉด NULL + PyErr_SetNone

โ‘ข ์ •์ˆ˜ ๋ณ€ํ™˜ (PyLong_AsLong / PyLong_FromLong)

  • Python ์ •์ˆ˜(๋ฌดํ•œ ์ •๋ฐ€๋„) โ†” C long(64๋น„ํŠธ) ๋ฒ”์œ„ ๊ฒ€์‚ฌ
  • ๋ฒ”์œ„ ์ดˆ๊ณผ โ†’ OverflowError, ํƒ€์ž… ๋ถˆ์ผ์น˜ โ†’ TypeError
  • PyArg_ParseTuple์˜ |i ํฌ๋งท์€ ์ด ๋ณ€ํ™˜์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ C ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ๋ถ„์„

3.3. Abstract Semantics

๊ณต์œ  ์ถ”์ƒ ๋„๋ฉ”์ธ

๊ฒฐํ•ฉ ์ถ”์ƒ ์ƒํƒœ: ฮฃ]pร—c = ฮฃฬƒ]p ร— ฮฃฬƒ]c ร— ฮฃ]u
                              โ†‘ ๊ณต์œ 
                   ์ฃผ์†Œ ํ• ๋‹น ์ถ”์ƒ + ์ˆ˜์น˜ ์ถ”์ƒ (Interval, Octagon ๋“ฑ)
  • Python๊ณผ C๊ฐ€ ๊ฐ™์€ ์ˆ˜์น˜ ๋„๋ฉ”์ธ์„ ๊ณต์œ  โ†’ ์–ธ์–ด ๊ฐ„ ๊ด€๊ณ„ํ˜• ๋ถˆ๋ณ€์‹ ํ‘œํ˜„ ๊ฐ€๋Šฅ
  • ์ถ”์ƒ ๊ฒฝ๊ณ„ ํ•จ์ˆ˜๋Š” ๊ตฌ์ฒด ๊ฒฝ๊ณ„ ํ•จ์ˆ˜์™€ 1:1 ๋Œ€์‘ โ†’ ๊ฑด์ „์„ฑ ์ฆ๋ช…์ด ๋‹จ์ˆœํ•ด์ง

๊ด€๊ณ„ํ˜• ๋ถ„์„์˜ ์ด์ 

๋น„๊ด€๊ณ„ํ˜•(Interval)๋งŒ์œผ๋กœ๋Š” Python ๋ณ€์ˆ˜ i์™€ C ๊ตฌ์กฐ์ฒด ํ•„๋“œ count์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†๋‹ค.

# rel_count.py
for i in range(randint(1, 100)):
    c.incr()
r = c.counter
assert(r == i + 1)  # ๋น„๊ด€๊ณ„ํ˜•์œผ๋กœ๋Š” ์ฆ๋ช… ๋ถˆ๊ฐ€

โ†’ Octagon ๋„๋ฉ”์ธ์œผ๋กœ num(@int) + 1 = num([Counter, offset16, s32]) ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๋ฉด ์–ด์„œ์…˜ ์ฆ๋ช… ๊ฐ€๋Šฅ


3.4. Mopsa Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚        CPython ๋‹ค์ค‘์–ธ์–ด ๋„๋ฉ”์ธ       โ”‚  โ† ๊ฒฝ๊ณ„ ์—ฐ์‚ฐ ๋‹ด๋‹น (์‹ ๊ทœ ~2,500์ค„)
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  Python ๋ถ„์„ โ”‚      C ๋ถ„์„          โ”‚  โ† ๊ธฐ์กด ๋ถ„์„๊ธฐ ์žฌ์‚ฌ์šฉ (์นดํ…Œ์‹œ์•ˆ ๊ณฑ)
โ”‚  ~12,600์ค„   โ”‚    ~11,700์ค„         โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚         Universal ๋„๋ฉ”์ธ            โ”‚  โ† ์ ˆ์ฐจ๊ฐ„ ๋ถ„์„, ๋ฃจํ”„, ์ฃผ์†Œ ํ• ๋‹น, ์ˆ˜์น˜ ์ถ”์ƒ
โ”‚              ~5,600์ค„               โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
         ๊ณตํ†ต ํ”„๋ ˆ์ž„์›Œํฌ ~13,200์ค„
  • ์„ค์ • ํŒŒ์ผ(DAG) ๋กœ ๋„๋ฉ”์ธ ์กฐํ•ฉ โ†’ ๋‹ค์ค‘์–ธ์–ด ๋„๋ฉ”์ธ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ธฐ์กด ๋ถ„์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์ˆ˜์น˜ ์ถ”์ƒ: ๊ธฐ๋ณธ๊ฐ’ Interval, ์„ ํƒ์ ์œผ๋กœ Octagon ๋“ฑ ๊ด€๊ณ„ํ˜• ๋„๋ฉ”์ธ์œผ๋กœ ๊ต์ฒด ๊ฐ€๋Šฅ
  • CPython C ํ•จ์ˆ˜ 60๊ฐœ(~650์ค„) ์›๋ณธ ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉ

4. Detectable Runtime Error

์˜์—ญ์˜ค๋ฅ˜ ์œ ํ˜•
C ์ฝ”๋“œ์ •์ˆ˜ ์˜ค๋ฒ„ํ”Œ๋กœ, ์ œ๋กœ ๋‚˜๋ˆ—์…ˆ, ์ž˜๋ชป๋œ ํฌ์ธํ„ฐ/๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ
Python ์ฝ”๋“œAttributeError, TypeError, ValueError
๊ฒฝ๊ณ„ (API)NULL โ†” ์˜ˆ์™ธ ๋ถˆ์ผ์น˜(SystemError), ์ •์ˆ˜ ๋ณ€ํ™˜ ์˜ค๋ฒ„ํ”Œ๋กœ(OverflowError)

5. Results

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌC์ค„Py์ค„๋ถ„์„ ์‹œ๊ฐ„C ์„ ํƒ์„ฑPy ์„ ํƒ์„ฑ
noise72267519s99.6%100.0%
ahocorasick3,5411,33659s93.1%98.0%
levenshtein5,4413571.6m79.9%93.2%
cdistance1,4339121.9m95.3%98.3%
llist2,8291,6864.3m99.0%98.8%
bitarray3,2442,5974.6m96.3%94.6%

์„ ํƒ์„ฑ(Selectivity) = ์•ˆ์ „ ํŒ์ • ์—ฐ์‚ฐ ์ˆ˜ / ์ „์ฒด ๊ฒ€์‚ฌ ์ˆ˜. ๋†’์„์ˆ˜๋ก ํ—ˆ์œ„ ๊ฒฝ๋ณด(false alarm)๊ฐ€ ์ ์Œ.