I am seeing a ~100ms overhead to process any document (text), which seems like it can't be correct given the performance data listed for large corpuses. I've been porting a large Python/NTLK app to Go, but my legacy Python/NLTK text parsing is running ~250x faster than my new go/prose implementation, which seems like I must be doing something wrong.
Did some external dependency break the performance of prose, or am I using the API incorrectly?
Simple performance test (Go 1.18)
Here's a simple test that processes the same short sentence twice. Both executions take ~100ms.
Code:
package main
import (
"fmt"
"time"
"github.com/jdkato/prose/v2"
)
var text = "This is a simple test."
func main() {
for i := 0; i < 2; i++ {
start := time.Now()
doc, err := prose.NewDocument(
text,
prose.WithExtraction(false),
prose.WithSegmentation(false))
duration := time.Since(start)
fmt.Println(duration)
if err != nil {
panic(err)
}
// Iterate over the doc's tokens:
fmt.Print(" ")
for _, tok := range doc.Tokens() {
fmt.Printf("(%v, %v) ", tok.Text, tok.Tag)
}
fmt.Println()
}
}
Output:
$ go run .
118.549243ms
(This, DT) (is, VBZ) (a, DT) (simple, JJ) (test, NN) (., .)
117.214746ms
(This, DT) (is, VBZ) (a, DT) (simple, JJ) (test, NN) (., .)
$
Comparison test using NLTK in Python (3.8)
When I run the same test using NLTK in Python, the first document processed also has ~100ms of overhead, but all subsequent documents are processed very quickly (~400usec in the example below):
Sample code:
#!/usr/bin/env python
import nltk
from datetime import datetime
text = "This is a simple test."
for _ in range(2):
start = datetime.now()
raw_tokens = nltk.word_tokenize(text)
pos_tokens = nltk.pos_tag(raw_tokens)
duration = datetime.now() - start
print(duration)
print(f' {pos_tokens}')
Output:
$ ./test-nltk.py
0:00:00.092738
[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('simple', 'JJ'), ('test', 'NN'), ('.', '.')]
0:00:00.000415
[('This', 'DT'), ('is', 'VBZ'), ('a', 'DT'), ('simple', 'JJ'), ('test', 'NN'), ('.', '.')]
$
I am seeing a ~100ms overhead to process any document (text), which seems like it can't be correct given the performance data listed for large corpuses. I've been porting a large Python/NTLK app to Go, but my legacy Python/NLTK text parsing is running ~250x faster than my new
go/proseimplementation, which seems like I must be doing something wrong.Did some external dependency break the performance of
prose, or am I using the API incorrectly?Simple performance test (Go 1.18)
Here's a simple test that processes the same short sentence twice. Both executions take ~100ms.
Code:
Output:
Comparison test using NLTK in Python (3.8)
When I run the same test using NLTK in Python, the first document processed also has ~100ms of overhead, but all subsequent documents are processed very quickly (~400usec in the example below):
Sample code:
Output: