diff --git a/natsort/Makefile b/natsort/Makefile new file mode 100644 index 0000000..7ae7b46 --- /dev/null +++ b/natsort/Makefile @@ -0,0 +1,14 @@ +run: build bench stat + +build: + go test -c -o natsort-bench.exec + +bench: + time ./natsort-bench.exec \ + -test.v -test.benchmem \ + -test.bench ^Benchmark \ + -test.count 3 \ + -test.run ^$ | tee bench.txt + +stat: + benchstat bench.txt diff --git a/natsort/bench.txt b/natsort/bench.txt new file mode 100644 index 0000000..31ef376 --- /dev/null +++ b/natsort/bench.txt @@ -0,0 +1,85 @@ +goos: darwin +goarch: arm64 +pkg: github.com/cristaloleg/benches/natsort +BenchmarkStdlib_Strings +BenchmarkStdlib_Strings/small +BenchmarkStdlib_Strings/small-10 561956 2117 ns/op 24 B/op 1 allocs/op +BenchmarkStdlib_Strings/small-10 547368 2121 ns/op 24 B/op 1 allocs/op +BenchmarkStdlib_Strings/small-10 545804 2125 ns/op 24 B/op 1 allocs/op +BenchmarkStdlib_Strings/huge +BenchmarkStdlib_Strings/huge-10 6225 188029 ns/op 24 B/op 1 allocs/op +BenchmarkStdlib_Strings/huge-10 6210 188691 ns/op 24 B/op 1 allocs/op +BenchmarkStdlib_Strings/huge-10 5698 187595 ns/op 24 B/op 1 allocs/op +BenchmarkCristalhq_Sort +BenchmarkCristalhq_Sort/small +BenchmarkCristalhq_Sort/small-10 316620 3794 ns/op 0 B/op 0 allocs/op +BenchmarkCristalhq_Sort/small-10 314504 3780 ns/op 0 B/op 0 allocs/op +BenchmarkCristalhq_Sort/small-10 310911 3792 ns/op 0 B/op 0 allocs/op +BenchmarkCristalhq_Sort/huge +BenchmarkCristalhq_Sort/huge-10 2227 522022 ns/op 0 B/op 0 allocs/op +BenchmarkCristalhq_Sort/huge-10 2328 525377 ns/op 0 B/op 0 allocs/op +BenchmarkCristalhq_Sort/huge-10 2269 519937 ns/op 0 B/op 0 allocs/op +BenchmarkCristalhq_Slice +BenchmarkCristalhq_Slice/small +BenchmarkCristalhq_Slice/small-10 295246 4081 ns/op 24 B/op 1 allocs/op +BenchmarkCristalhq_Slice/small-10 294901 4051 ns/op 24 B/op 1 allocs/op +BenchmarkCristalhq_Slice/small-10 295615 4119 ns/op 24 B/op 1 allocs/op +BenchmarkCristalhq_Slice/huge +BenchmarkCristalhq_Slice/huge-10 2246 537975 ns/op 24 B/op 1 allocs/op +BenchmarkCristalhq_Slice/huge-10 2256 537370 ns/op 24 B/op 1 allocs/op +BenchmarkCristalhq_Slice/huge-10 2218 532765 ns/op 24 B/op 1 allocs/op +BenchmarkFacette_Sort +BenchmarkFacette_Sort/small +BenchmarkFacette_Sort/small-10 6409 184176 ns/op 101048 B/op 1810 allocs/op +BenchmarkFacette_Sort/small-10 6489 180198 ns/op 101429 B/op 1815 allocs/op +BenchmarkFacette_Sort/small-10 6244 182682 ns/op 101242 B/op 1812 allocs/op +BenchmarkFacette_Sort/huge +BenchmarkFacette_Sort/huge-10 45 25645570 ns/op 16170764 B/op 323866 allocs/op +BenchmarkFacette_Sort/huge-10 43 25996568 ns/op 16258429 B/op 325554 allocs/op +BenchmarkFacette_Sort/huge-10 44 25354756 ns/op 16208050 B/op 324899 allocs/op +BenchmarkMaruel_Sort +BenchmarkMaruel_Sort/small +BenchmarkMaruel_Sort/small-10 247838 4673 ns/op 24 B/op 1 allocs/op +BenchmarkMaruel_Sort/small-10 250066 4685 ns/op 24 B/op 1 allocs/op +BenchmarkMaruel_Sort/small-10 250335 4690 ns/op 24 B/op 1 allocs/op +BenchmarkMaruel_Sort/huge +BenchmarkMaruel_Sort/huge-10 1462 808731 ns/op 24 B/op 1 allocs/op +BenchmarkMaruel_Sort/huge-10 1460 816428 ns/op 24 B/op 1 allocs/op +BenchmarkMaruel_Sort/huge-10 1400 827159 ns/op 24 B/op 1 allocs/op +BenchmarkDangogh_Slice +BenchmarkDangogh_Slice/small +BenchmarkDangogh_Slice/small-10 91945 13080 ns/op 24 B/op 1 allocs/op +BenchmarkDangogh_Slice/small-10 89635 13014 ns/op 24 B/op 1 allocs/op +BenchmarkDangogh_Slice/small-10 92401 13013 ns/op 24 B/op 1 allocs/op +BenchmarkDangogh_Slice/huge +BenchmarkDangogh_Slice/huge-10 738 1639175 ns/op 24 B/op 1 allocs/op +BenchmarkDangogh_Slice/huge-10 728 1658934 ns/op 24 B/op 1 allocs/op +BenchmarkDangogh_Slice/huge-10 724 1647764 ns/op 24 B/op 1 allocs/op +BenchmarkEvie404_Slice +BenchmarkEvie404_Slice/small +BenchmarkEvie404_Slice/small-10 95402 12068 ns/op 24 B/op 1 allocs/op +BenchmarkEvie404_Slice/small-10 98350 12067 ns/op 24 B/op 1 allocs/op +BenchmarkEvie404_Slice/small-10 96961 12054 ns/op 24 B/op 1 allocs/op +BenchmarkEvie404_Slice/huge +BenchmarkEvie404_Slice/huge-10 1470 817867 ns/op 24 B/op 1 allocs/op +BenchmarkEvie404_Slice/huge-10 1480 806769 ns/op 24 B/op 1 allocs/op +BenchmarkEvie404_Slice/huge-10 1456 805209 ns/op 24 B/op 1 allocs/op +BenchmarkMiraclesu_Slice +BenchmarkMiraclesu_Slice/small +BenchmarkMiraclesu_Slice/small-10 105171 11270 ns/op 57 B/op 5 allocs/op +BenchmarkMiraclesu_Slice/small-10 106788 11159 ns/op 57 B/op 5 allocs/op +BenchmarkMiraclesu_Slice/small-10 107000 11291 ns/op 57 B/op 5 allocs/op +BenchmarkMiraclesu_Slice/huge +BenchmarkMiraclesu_Slice/huge-10 862 1387731 ns/op 24 B/op 1 allocs/op +BenchmarkMiraclesu_Slice/huge-10 861 1378709 ns/op 24 B/op 1 allocs/op +BenchmarkMiraclesu_Slice/huge-10 865 1392451 ns/op 24 B/op 1 allocs/op +BenchmarkImmortal_Slice +BenchmarkImmortal_Slice/small +BenchmarkImmortal_Slice/small-10 55617 20679 ns/op 12499 B/op 385 allocs/op +BenchmarkImmortal_Slice/small-10 58698 20083 ns/op 12494 B/op 384 allocs/op +BenchmarkImmortal_Slice/small-10 58990 20010 ns/op 12495 B/op 384 allocs/op +BenchmarkImmortal_Slice/huge +BenchmarkImmortal_Slice/huge-10 782 1515601 ns/op 950145 B/op 33556 allocs/op +BenchmarkImmortal_Slice/huge-10 780 1525203 ns/op 951441 B/op 33601 allocs/op +BenchmarkImmortal_Slice/huge-10 789 1498044 ns/op 950063 B/op 33555 allocs/op +PASS diff --git a/natsort/go.mod b/natsort/go.mod new file mode 100644 index 0000000..dc2990b --- /dev/null +++ b/natsort/go.mod @@ -0,0 +1,15 @@ +module github.com/cristaloleg/benches/natsort + +go 1.20 + +require ( + github.com/cristalhq/natsort v0.1.1 + github.com/dangogh/naturally v0.1.1 + github.com/evie404/natsort v0.0.0-20180124032556-f194e6bd5b0c + github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb + github.com/immortal/natcasesort v0.0.0-20180922190600-53ad4be8bc1a + github.com/maruel/natural v1.1.0 + github.com/miraclesu/natsort v0.0.0-20160121124727-836e59d384de +) + +require github.com/smartystreets/goconvey v1.8.0 // indirect diff --git a/natsort/go.sum b/natsort/go.sum new file mode 100644 index 0000000..6f1b660 --- /dev/null +++ b/natsort/go.sum @@ -0,0 +1,19 @@ +github.com/cristalhq/natsort v0.1.1 h1:UlPHSkP+Tx2f0wgoZS3N3U29nO3NF7lHvhEKuQr8LpY= +github.com/cristalhq/natsort v0.1.1/go.mod h1:cGdtrXl4O1ycmnwdnSBWgmTzZ9WP4i8ca2LH/QupN0Y= +github.com/dangogh/naturally v0.1.1 h1:q9j9n4Ij/cjZv7MOUj+871HTrCJE3ZJeoJrw5CjPrC0= +github.com/dangogh/naturally v0.1.1/go.mod h1:pmGmUAFR+GoKRXHpf/K5Hs2JP0o8oatc3t0NeVjrf8U= +github.com/evie404/natsort v0.0.0-20180124032556-f194e6bd5b0c h1:DNvN+Lov05ao9/haEzCTzJDfIHL/F4E3DBsDUMnjpYs= +github.com/evie404/natsort v0.0.0-20180124032556-f194e6bd5b0c/go.mod h1:+D05cmtvIC2Mc7z7x+AM82AAbaaBlUI9fMHJomz77qI= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= +github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= +github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/immortal/natcasesort v0.0.0-20180922190600-53ad4be8bc1a h1:xGCNWvZqUk/9l1ytDVzZHLAadyrB6My8AoG6ksxWbDU= +github.com/immortal/natcasesort v0.0.0-20180922190600-53ad4be8bc1a/go.mod h1:wrlf+Cc7o4fqKniC+4ebBmr6sJ8eeOjx5588f/4RgIU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/maruel/natural v1.1.0 h1:2z1NgP/Vae+gYrtC0VuvrTJ6U35OuyUqDdfluLqMWuQ= +github.com/maruel/natural v1.1.0/go.mod h1:eFVhYCcUOfZFxXoDZam8Ktya72wa79fNC3lc/leA0DQ= +github.com/miraclesu/natsort v0.0.0-20160121124727-836e59d384de h1:ZTLp5p4MzSKh9Is0s+l/J7qQiY4c3yKA98J5z1qcyv0= +github.com/miraclesu/natsort v0.0.0-20160121124727-836e59d384de/go.mod h1:hYCDR4MVndk4vkatvVgNzw27cfxJH+fLFSMFdjdMXmQ= +github.com/smartystreets/assertions v1.13.1 h1:Ef7KhSmjZcK6AVf9YbJdvPYG9avaF0ZxudX+ThRdWfU= +github.com/smartystreets/goconvey v1.8.0 h1:Oi49ha/2MURE0WexF052Z0m+BNSGirfjg5RL+JXWq3w= +github.com/smartystreets/goconvey v1.8.0/go.mod h1:EdX8jtrTIj26jmjCOVNMVSIYAtgexqXKHOXW2Dx9JLg= diff --git a/natsort/natsort_test.go b/natsort/natsort_test.go new file mode 100644 index 0000000..f13e6cc --- /dev/null +++ b/natsort/natsort_test.go @@ -0,0 +1,186 @@ +package natsort_test + +import ( + "bytes" + _ "embed" + "math/rand" + "sort" + "testing" + + cristalhq "github.com/cristalhq/natsort" + dangogh "github.com/dangogh/naturally" + evie404 "github.com/evie404/natsort" + facette "github.com/facette/natsort" + immortal "github.com/immortal/natcasesort" + maruel "github.com/maruel/natural" + miraclesu "github.com/miraclesu/natsort" +) + +func BenchmarkStdlib_Strings(b *testing.B) { + bench(b, "small", smallList, func(list []string) { + sort.Strings(list) + }) + + bench(b, "huge", tagsList, func(list []string) { + sort.Strings(list) + }) + + // no need to checkResult(..) because stdlib sort is correct + // and result is sorted in lexicographical order, not natural +} + +func BenchmarkCristalhq_Sort(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + cristalhq.Sort(list) + }) + checkResult(b, data) + + data = bench(b, "huge", tagsList, func(list []string) { + cristalhq.Sort(list) + }) + checkResult(b, data) +} + +func BenchmarkCristalhq_Slice(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + sort.Sort(cristalhq.Slice[string](list)) + }) + checkResult(b, data) + + data = bench(b, "huge", tagsList, func(list []string) { + sort.Sort(cristalhq.Slice[string](list)) + }) + checkResult(b, data) +} + +func BenchmarkFacette_Sort(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + facette.Sort(list) + }) + checkResult(b, data) + + data = bench(b, "huge", tagsList, func(list []string) { + facette.Sort(list) + }) + // no check, small variance in the result +} + +func BenchmarkMaruel_Sort(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + sort.Sort(maruel.StringSlice(list)) + }) + checkResult(b, data) + + data = bench(b, "huge", tagsList, func(list []string) { + sort.Sort(maruel.StringSlice(list)) + }) + checkResult(b, data) +} + +func BenchmarkDangogh_Slice(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + sort.Sort(dangogh.StringSlice(list)) + }) + // no check, incorrect result + _ = data + + data = bench(b, "huge", tagsList, func(list []string) { + sort.Sort(dangogh.StringSlice(list)) + }) + // no check, incorrect result +} + +func BenchmarkEvie404_Slice(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + evie404.Strings(list) + }) + checkResult(b, data) + + data = bench(b, "huge", tagsList, func(list []string) { + evie404.Strings(list) + }) + checkResult(b, data) +} + +func BenchmarkMiraclesu_Slice(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + miraclesu.Sort(list) + }) + // no check, incorrect result + _ = data + + data = bench(b, "huge", tagsList, func(list []string) { + miraclesu.Sort(list) + }) + // no check, incorrect result +} + +func BenchmarkImmortal_Slice(b *testing.B) { + data := bench(b, "small", smallList, func(list []string) { + sort.Sort(immortal.Sort(list)) + }) + // no check, incorrect result + _ = data + + data = bench(b, "huge", tagsList, func(list []string) { + sort.Sort(immortal.Sort(list)) + }) + // no check, incorrect result +} + +func bench(b *testing.B, name string, input []string, fn func(list []string)) []string { + b.Helper() + + data := make([]string, len(input)) + r := rand.New(rand.NewSource(69420)) + copy(data, input) + + b.Run(name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + r.Shuffle(len(data), func(i, j int) { + data[i], data[j] = data[j], data[i] + }) + fn(data) + } + }) + return data +} + +func checkResult(b *testing.B, list []string) { + b.Helper() + + ok := sort.SliceIsSorted(list, func(i, j int) bool { + return cristalhq.Less(list[i], list[j]) + }) + if !ok { + b.Errorf("not sorted %+v", list) + } +} + +var ( + //go:embed testdata/small.txt + smallFile []byte + + //go:embed testdata/aws-sdk-go-tags.txt + tagsFile []byte +) + +var ( + smallList []string + tagsList []string +) + +func init() { + smallList = readFile(smallFile) + tagsList = readFile(tagsFile) +} + +func readFile(raw []byte) []string { + lines := bytes.Split(raw, []byte{'\n'}) + res := make([]string, len(lines)) + + for i, line := range lines { + res[i] = string(line) + } + return res +} diff --git a/natsort/testdata/aws-sdk-go-tags.txt b/natsort/testdata/aws-sdk-go-tags.txt new file mode 100644 index 0000000..aa8f51b --- /dev/null +++ b/natsort/testdata/aws-sdk-go-tags.txt @@ -0,0 +1,1556 @@ +1.4.13 +1.4.14 +v.1.2.9 +v0.10.0 +v0.10.1 +v0.10.2 +v0.10.3 +v0.10.4 +v0.6.0 +v0.6.1 +v0.6.2 +v0.6.3 +v0.6.4 +v0.6.5 +v0.6.6 +v0.6.7 +v0.6.8 +v0.7.0 +v0.7.1 +v0.7.2 +v0.7.3 +v0.7.4 +v0.9.0rc1 +v0.9.10 +v0.9.11 +v0.9.12 +v0.9.13 +v0.9.14 +v0.9.15 +v0.9.16 +v0.9.17 +v0.9.1rc2 +v0.9.2rc3 +v0.9.3rc4 +v0.9.4rc5 +v0.9.5 +v0.9.6 +v0.9.7 +v0.9.8 +v0.9.9 +v1.0.0 +v1.0.1 +v1.0.10 +v1.0.11 +v1.0.2 +v1.0.3 +v1.0.4 +v1.0.5 +v1.0.6 +v1.0.7 +v1.0.8 +v1.0.9 +v1.1.0 +v1.1.1 +v1.1.10 +v1.1.11 +v1.1.12 +v1.1.13 +v1.1.14 +v1.1.15 +v1.1.16 +v1.1.17 +v1.1.18 +v1.1.19 +v1.1.2 +v1.1.20 +v1.1.21 +v1.1.22 +v1.1.23 +v1.1.24 +v1.1.25 +v1.1.26 +v1.1.27 +v1.1.28 +v1.1.29 +v1.1.3 +v1.1.30 +v1.1.31 +v1.1.32 +v1.1.33 +v1.1.34 +v1.1.35 +v1.1.36 +v1.1.4 +v1.1.5 +v1.1.6 +v1.1.7 +v1.1.8 +v1.1.9 +v1.10.0 +v1.10.1 +v1.10.10 +v1.10.11 +v1.10.12 +v1.10.13 +v1.10.14 +v1.10.15 +v1.10.16 +v1.10.17 +v1.10.18 +v1.10.19 +v1.10.2 +v1.10.20 +v1.10.21 +v1.10.22 +v1.10.23 +v1.10.24 +v1.10.25 +v1.10.26 +v1.10.27 +v1.10.28 +v1.10.29 +v1.10.3 +v1.10.30 +v1.10.31 +v1.10.32 +v1.10.33 +v1.10.34 +v1.10.35 +v1.10.36 +v1.10.37 +v1.10.38 +v1.10.39 +v1.10.4 +v1.10.40 +v1.10.41 +v1.10.42 +v1.10.43 +v1.10.44 +v1.10.45 +v1.10.46 +v1.10.47 +v1.10.48 +v1.10.49 +v1.10.5 +v1.10.50 +v1.10.51 +v1.10.6 +v1.10.7 +v1.10.8 +v1.10.9 +v1.11.0 +v1.12.0 +v1.12.1 +v1.12.10 +v1.12.11 +v1.12.12 +v1.12.13 +v1.12.14 +v1.12.15 +v1.12.16 +v1.12.17 +v1.12.18 +v1.12.19 +v1.12.2 +v1.12.20 +v1.12.21 +v1.12.22 +v1.12.23 +v1.12.24 +v1.12.25 +v1.12.26 +v1.12.27 +v1.12.28 +v1.12.29 +v1.12.3 +v1.12.30 +v1.12.31 +v1.12.32 +v1.12.33 +v1.12.34 +v1.12.35 +v1.12.36 +v1.12.37 +v1.12.38 +v1.12.39 +v1.12.4 +v1.12.40 +v1.12.41 +v1.12.42 +v1.12.43 +v1.12.44 +v1.12.45 +v1.12.46 +v1.12.47 +v1.12.48 +v1.12.49 +v1.12.5 +v1.12.50 +v1.12.51 +v1.12.52 +v1.12.53 +v1.12.54 +v1.12.55 +v1.12.56 +v1.12.57 +v1.12.58 +v1.12.59 +v1.12.6 +v1.12.60 +v1.12.61 +v1.12.62 +v1.12.63 +v1.12.64 +v1.12.65 +v1.12.66 +v1.12.67 +v1.12.68 +v1.12.69 +v1.12.7 +v1.12.70 +v1.12.71 +v1.12.72 +v1.12.73 +v1.12.74 +v1.12.75 +v1.12.76 +v1.12.77 +v1.12.78 +v1.12.79 +v1.12.8 +v1.12.9 +v1.13.0 +v1.13.1 +v1.13.10 +v1.13.11 +v1.13.12 +v1.13.13 +v1.13.14 +v1.13.15 +v1.13.16 +v1.13.17 +v1.13.18 +v1.13.19 +v1.13.2 +v1.13.20 +v1.13.21 +v1.13.22 +v1.13.23 +v1.13.24 +v1.13.25 +v1.13.26 +v1.13.27 +v1.13.28 +v1.13.29 +v1.13.3 +v1.13.30 +v1.13.31 +v1.13.32 +v1.13.33 +v1.13.34 +v1.13.35 +v1.13.36 +v1.13.37 +v1.13.38 +v1.13.39 +v1.13.4 +v1.13.40 +v1.13.41 +v1.13.42 +v1.13.43 +v1.13.44 +v1.13.45 +v1.13.46 +v1.13.47 +v1.13.48 +v1.13.49 +v1.13.5 +v1.13.50 +v1.13.51 +v1.13.52 +v1.13.53 +v1.13.54 +v1.13.55 +v1.13.56 +v1.13.57 +v1.13.58 +v1.13.59 +v1.13.6 +v1.13.60 +v1.13.7 +v1.13.8 +v1.13.9 +v1.14.0 +v1.14.1 +v1.14.10 +v1.14.11 +v1.14.12 +v1.14.13 +v1.14.14 +v1.14.15 +v1.14.16 +v1.14.17 +v1.14.18 +v1.14.19 +v1.14.2 +v1.14.20 +v1.14.21 +v1.14.22 +v1.14.23 +v1.14.24 +v1.14.25 +v1.14.26 +v1.14.27 +v1.14.28 +v1.14.29 +v1.14.3 +v1.14.30 +v1.14.31 +v1.14.32 +v1.14.33 +v1.14.4 +v1.14.5 +v1.14.6 +v1.14.7 +v1.14.8 +v1.14.9 +v1.15.0 +v1.15.1 +v1.15.10 +v1.15.11 +v1.15.12 +v1.15.13 +v1.15.14 +v1.15.15 +v1.15.16 +v1.15.17 +v1.15.18 +v1.15.19 +v1.15.2 +v1.15.20 +v1.15.21 +v1.15.22 +v1.15.23 +v1.15.24 +v1.15.25 +v1.15.26 +v1.15.27 +v1.15.28 +v1.15.29 +v1.15.3 +v1.15.30 +v1.15.31 +v1.15.32 +v1.15.33 +v1.15.34 +v1.15.35 +v1.15.36 +v1.15.37 +v1.15.38 +v1.15.39 +v1.15.4 +v1.15.40 +v1.15.41 +v1.15.42 +v1.15.43 +v1.15.44 +v1.15.45 +v1.15.46 +v1.15.47 +v1.15.48 +v1.15.49 +v1.15.5 +v1.15.50 +v1.15.51 +v1.15.52 +v1.15.53 +v1.15.54 +v1.15.55 +v1.15.56 +v1.15.57 +v1.15.58 +v1.15.59 +v1.15.6 +v1.15.60 +v1.15.61 +v1.15.62 +v1.15.63 +v1.15.64 +v1.15.65 +v1.15.66 +v1.15.67 +v1.15.68 +v1.15.69 +v1.15.7 +v1.15.70 +v1.15.71 +v1.15.72 +v1.15.73 +v1.15.74 +v1.15.75 +v1.15.76 +v1.15.77 +v1.15.78 +v1.15.79 +v1.15.8 +v1.15.80 +v1.15.81 +v1.15.82 +v1.15.83 +v1.15.84 +v1.15.85 +v1.15.86 +v1.15.87 +v1.15.88 +v1.15.89 +v1.15.9 +v1.15.90 +v1.16.0 +v1.16.1 +v1.16.10 +v1.16.11 +v1.16.12 +v1.16.13 +v1.16.14 +v1.16.15 +v1.16.16 +v1.16.17 +v1.16.18 +v1.16.19 +v1.16.2 +v1.16.20 +v1.16.21 +v1.16.22 +v1.16.23 +v1.16.24 +v1.16.25 +v1.16.26 +v1.16.27 +v1.16.28 +v1.16.29 +v1.16.3 +v1.16.30 +v1.16.31 +v1.16.32 +v1.16.33 +v1.16.34 +v1.16.35 +v1.16.36 +v1.16.4 +v1.16.5 +v1.16.6 +v1.16.7 +v1.16.8 +v1.16.9 +v1.17.0 +v1.17.1 +v1.17.10 +v1.17.11 +v1.17.12 +v1.17.13 +v1.17.14 +v1.17.2 +v1.17.3 +v1.17.4 +v1.17.5 +v1.17.6 +v1.17.7 +v1.17.8 +v1.17.9 +v1.18.0 +v1.18.1 +v1.18.2 +v1.18.3 +v1.18.4 +v1.18.5 +v1.18.6 +v1.19.0 +v1.19.1 +v1.19.10 +v1.19.11 +v1.19.12 +v1.19.13 +v1.19.14 +v1.19.15 +v1.19.16 +v1.19.17 +v1.19.18 +v1.19.19 +v1.19.2 +v1.19.20 +v1.19.21 +v1.19.22 +v1.19.23 +v1.19.24 +v1.19.25 +v1.19.26 +v1.19.27 +v1.19.28 +v1.19.29 +v1.19.3 +v1.19.30 +v1.19.31 +v1.19.32 +v1.19.33 +v1.19.34 +v1.19.35 +v1.19.36 +v1.19.37 +v1.19.38 +v1.19.39 +v1.19.4 +v1.19.40 +v1.19.41 +v1.19.42 +v1.19.43 +v1.19.44 +v1.19.45 +v1.19.46 +v1.19.47 +v1.19.48 +v1.19.49 +v1.19.5 +v1.19.6 +v1.19.7 +v1.19.8 +v1.19.9 +v1.2.0 +v1.2.1 +v1.2.10 +v1.2.2 +v1.2.3 +v1.2.4 +v1.2.5 +v1.2.6 +v1.2.7 +v1.2.8 +v1.20.0 +v1.20.1 +v1.20.10 +v1.20.11 +v1.20.12 +v1.20.13 +v1.20.14 +v1.20.15 +v1.20.16 +v1.20.17 +v1.20.18 +v1.20.19 +v1.20.2 +v1.20.20 +v1.20.21 +v1.20.3 +v1.20.4 +v1.20.5 +v1.20.6 +v1.20.7 +v1.20.8 +v1.20.9 +v1.21.0 +v1.21.1 +v1.21.10 +v1.21.2 +v1.21.3 +v1.21.4 +v1.21.5 +v1.21.6 +v1.21.7 +v1.21.8 +v1.21.9 +v1.22.0 +v1.22.1 +v1.22.2 +v1.22.3 +v1.22.4 +v1.23.0 +v1.23.1 +v1.23.10 +v1.23.11 +v1.23.12 +v1.23.13 +v1.23.14 +v1.23.15 +v1.23.16 +v1.23.17 +v1.23.18 +v1.23.19 +v1.23.2 +v1.23.20 +v1.23.21 +v1.23.22 +v1.23.3 +v1.23.4 +v1.23.5 +v1.23.6 +v1.23.7 +v1.23.8 +v1.23.9 +v1.24.0 +v1.24.1 +v1.24.2 +v1.24.3 +v1.24.4 +v1.24.5 +v1.24.6 +v1.25.0 +v1.25.1 +v1.25.10 +v1.25.11 +v1.25.12 +v1.25.13 +v1.25.14 +v1.25.15 +v1.25.16 +v1.25.17 +v1.25.18 +v1.25.19 +v1.25.2 +v1.25.20 +v1.25.21 +v1.25.22 +v1.25.23 +v1.25.24 +v1.25.25 +v1.25.26 +v1.25.27 +v1.25.28 +v1.25.29 +v1.25.3 +v1.25.30 +v1.25.31 +v1.25.32 +v1.25.33 +v1.25.34 +v1.25.35 +v1.25.36 +v1.25.37 +v1.25.38 +v1.25.39 +v1.25.4 +v1.25.40 +v1.25.41 +v1.25.42 +v1.25.43 +v1.25.44 +v1.25.45 +v1.25.46 +v1.25.47 +v1.25.48 +v1.25.49 +v1.25.5 +v1.25.50 +v1.25.6 +v1.25.7 +v1.25.8 +v1.25.9 +v1.26.0 +v1.26.1 +v1.26.2 +v1.26.3 +v1.26.4 +v1.26.5 +v1.26.6 +v1.26.7 +v1.26.8 +v1.27.0 +v1.27.1 +v1.27.2 +v1.27.3 +v1.27.4 +v1.28.0 +v1.28.1 +v1.28.10 +v1.28.11 +v1.28.12 +v1.28.13 +v1.28.14 +v1.28.2 +v1.28.3 +v1.28.4 +v1.28.5 +v1.28.6 +v1.28.7 +v1.28.8 +v1.28.9 +v1.29.0 +v1.29.1 +v1.29.10 +v1.29.11 +v1.29.12 +v1.29.13 +v1.29.14 +v1.29.15 +v1.29.16 +v1.29.17 +v1.29.18 +v1.29.19 +v1.29.2 +v1.29.20 +v1.29.21 +v1.29.22 +v1.29.23 +v1.29.24 +v1.29.25 +v1.29.26 +v1.29.27 +v1.29.28 +v1.29.29 +v1.29.3 +v1.29.30 +v1.29.31 +v1.29.32 +v1.29.33 +v1.29.34 +v1.29.4 +v1.29.5 +v1.29.6 +v1.29.7 +v1.29.8 +v1.29.9 +v1.3.0 +v1.3.1 +v1.30.0 +v1.30.1 +v1.30.10 +v1.30.11 +v1.30.12 +v1.30.13 +v1.30.14 +v1.30.15 +v1.30.16 +v1.30.17 +v1.30.18 +v1.30.19 +v1.30.2 +v1.30.20 +v1.30.21 +v1.30.22 +v1.30.23 +v1.30.24 +v1.30.25 +v1.30.26 +v1.30.27 +v1.30.28 +v1.30.29 +v1.30.3 +v1.30.4 +v1.30.5 +v1.30.6 +v1.30.7 +v1.30.8 +v1.30.9 +v1.31.0 +v1.31.1 +v1.31.10 +v1.31.11 +v1.31.12 +v1.31.13 +v1.31.14 +v1.31.15 +v1.31.2 +v1.31.3 +v1.31.4 +v1.31.5 +v1.31.6 +v1.31.7 +v1.31.8 +v1.31.9 +v1.32.0 +v1.32.1 +v1.32.10 +v1.32.11 +v1.32.12 +v1.32.13 +v1.32.2 +v1.32.3 +v1.32.4 +v1.32.5 +v1.32.6 +v1.32.7 +v1.32.8 +v1.32.9 +v1.33.0 +v1.33.1 +v1.33.10 +v1.33.11 +v1.33.12 +v1.33.13 +v1.33.14 +v1.33.15 +v1.33.16 +v1.33.17 +v1.33.18 +v1.33.19 +v1.33.2 +v1.33.20 +v1.33.21 +v1.33.3 +v1.33.4 +v1.33.5 +v1.33.6 +v1.33.7 +v1.33.8 +v1.33.9 +v1.34.0 +v1.34.1 +v1.34.10 +v1.34.11 +v1.34.12 +v1.34.13 +v1.34.14 +v1.34.15 +v1.34.16 +v1.34.17 +v1.34.18 +v1.34.19 +v1.34.2 +v1.34.20 +v1.34.21 +v1.34.22 +v1.34.23 +v1.34.24 +v1.34.25 +v1.34.26 +v1.34.27 +v1.34.28 +v1.34.29 +v1.34.3 +v1.34.30 +v1.34.31 +v1.34.32 +v1.34.33 +v1.34.34 +v1.34.4 +v1.34.5 +v1.34.6 +v1.34.7 +v1.34.8 +v1.34.9 +v1.35.0 +v1.35.1 +v1.35.10 +v1.35.11 +v1.35.12 +v1.35.13 +v1.35.14 +v1.35.15 +v1.35.16 +v1.35.17 +v1.35.18 +v1.35.19 +v1.35.2 +v1.35.20 +v1.35.21 +v1.35.22 +v1.35.23 +v1.35.24 +v1.35.25 +v1.35.26 +v1.35.27 +v1.35.28 +v1.35.29 +v1.35.3 +v1.35.30 +v1.35.31 +v1.35.32 +v1.35.33 +v1.35.34 +v1.35.35 +v1.35.36 +v1.35.37 +v1.35.4 +v1.35.5 +v1.35.6 +v1.35.7 +v1.35.8 +v1.35.9 +v1.36.0 +v1.36.1 +v1.36.10 +v1.36.11 +v1.36.12 +v1.36.13 +v1.36.14 +v1.36.15 +v1.36.16 +v1.36.17 +v1.36.18 +v1.36.19 +v1.36.2 +v1.36.20 +v1.36.21 +v1.36.22 +v1.36.23 +v1.36.24 +v1.36.25 +v1.36.26 +v1.36.27 +v1.36.28 +v1.36.29 +v1.36.3 +v1.36.30 +v1.36.31 +v1.36.32 +v1.36.33 +v1.36.4 +v1.36.5 +v1.36.6 +v1.36.7 +v1.36.8 +v1.36.9 +v1.37.0 +v1.37.1 +v1.37.10 +v1.37.11 +v1.37.12 +v1.37.13 +v1.37.14 +v1.37.15 +v1.37.16 +v1.37.17 +v1.37.18 +v1.37.19 +v1.37.2 +v1.37.20 +v1.37.21 +v1.37.22 +v1.37.23 +v1.37.24 +v1.37.25 +v1.37.26 +v1.37.27 +v1.37.28 +v1.37.29 +v1.37.3 +v1.37.30 +v1.37.31 +v1.37.32 +v1.37.33 +v1.37.4 +v1.37.5 +v1.37.6 +v1.37.7 +v1.37.8 +v1.37.9 +v1.38.0 +v1.38.1 +v1.38.10 +v1.38.11 +v1.38.12 +v1.38.13 +v1.38.14 +v1.38.15 +v1.38.16 +v1.38.17 +v1.38.18 +v1.38.19 +v1.38.2 +v1.38.20 +v1.38.21 +v1.38.22 +v1.38.23 +v1.38.24 +v1.38.25 +v1.38.26 +v1.38.27 +v1.38.28 +v1.38.29 +v1.38.3 +v1.38.30 +v1.38.31 +v1.38.32 +v1.38.33 +v1.38.34 +v1.38.35 +v1.38.36 +v1.38.37 +v1.38.38 +v1.38.39 +v1.38.4 +v1.38.40 +v1.38.41 +v1.38.42 +v1.38.43 +v1.38.44 +v1.38.45 +v1.38.46 +v1.38.47 +v1.38.48 +v1.38.49 +v1.38.5 +v1.38.50 +v1.38.51 +v1.38.52 +v1.38.53 +v1.38.54 +v1.38.55 +v1.38.56 +v1.38.57 +v1.38.58 +v1.38.59 +v1.38.6 +v1.38.60 +v1.38.61 +v1.38.62 +v1.38.63 +v1.38.64 +v1.38.65 +v1.38.66 +v1.38.67 +v1.38.68 +v1.38.69 +v1.38.7 +v1.38.70 +v1.38.71 +v1.38.8 +v1.38.9 +v1.39.0 +v1.39.1 +v1.39.2 +v1.39.3 +v1.39.4 +v1.39.5 +v1.39.6 +v1.4.0 +v1.4.1 +v1.4.10 +v1.4.11 +v1.4.12 +v1.4.15 +v1.4.16 +v1.4.17 +v1.4.18 +v1.4.19 +v1.4.2 +v1.4.20 +v1.4.21 +v1.4.22 +v1.4.3 +v1.4.4 +v1.4.5 +v1.4.6 +v1.4.7 +v1.4.8 +v1.4.9 +v1.40.0 +v1.40.1 +v1.40.10 +v1.40.11 +v1.40.12 +v1.40.13 +v1.40.14 +v1.40.15 +v1.40.16 +v1.40.17 +v1.40.18 +v1.40.19 +v1.40.2 +v1.40.20 +v1.40.21 +v1.40.22 +v1.40.23 +v1.40.24 +v1.40.25 +v1.40.26 +v1.40.27 +v1.40.28 +v1.40.29 +v1.40.3 +v1.40.30 +v1.40.31 +v1.40.32 +v1.40.33 +v1.40.34 +v1.40.35 +v1.40.36 +v1.40.37 +v1.40.38 +v1.40.39 +v1.40.4 +v1.40.40 +v1.40.41 +v1.40.42 +v1.40.43 +v1.40.44 +v1.40.45 +v1.40.46 +v1.40.47 +v1.40.48 +v1.40.49 +v1.40.5 +v1.40.50 +v1.40.51 +v1.40.52 +v1.40.53 +v1.40.54 +v1.40.55 +v1.40.56 +v1.40.57 +v1.40.58 +v1.40.59 +v1.40.6 +v1.40.7 +v1.40.8 +v1.40.9 +v1.41.0 +v1.41.1 +v1.41.10 +v1.41.11 +v1.41.12 +v1.41.13 +v1.41.14 +v1.41.15 +v1.41.16 +v1.41.17 +v1.41.18 +v1.41.19 +v1.41.2 +v1.41.3 +v1.41.4 +v1.41.5 +v1.41.6 +v1.41.7 +v1.41.8 +v1.41.9 +v1.42.0 +v1.42.1 +v1.42.10 +v1.42.11 +v1.42.12 +v1.42.13 +v1.42.14 +v1.42.15 +v1.42.16 +v1.42.17 +v1.42.18 +v1.42.19 +v1.42.2 +v1.42.20 +v1.42.21 +v1.42.22 +v1.42.23 +v1.42.24 +v1.42.25 +v1.42.26 +v1.42.27 +v1.42.28 +v1.42.29 +v1.42.3 +v1.42.30 +v1.42.31 +v1.42.32 +v1.42.33 +v1.42.34 +v1.42.35 +v1.42.36 +v1.42.37 +v1.42.38 +v1.42.39 +v1.42.4 +v1.42.40 +v1.42.41 +v1.42.42 +v1.42.43 +v1.42.44 +v1.42.45 +v1.42.46 +v1.42.47 +v1.42.48 +v1.42.49 +v1.42.5 +v1.42.50 +v1.42.51 +v1.42.52 +v1.42.53 +v1.42.6 +v1.42.7 +v1.42.8 +v1.42.9 +v1.43.0 +v1.43.1 +v1.43.10 +v1.43.11 +v1.43.12 +v1.43.13 +v1.43.14 +v1.43.15 +v1.43.16 +v1.43.17 +v1.43.18 +v1.43.19 +v1.43.2 +v1.43.20 +v1.43.21 +v1.43.22 +v1.43.23 +v1.43.24 +v1.43.25 +v1.43.26 +v1.43.27 +v1.43.28 +v1.43.29 +v1.43.3 +v1.43.30 +v1.43.31 +v1.43.32 +v1.43.33 +v1.43.34 +v1.43.35 +v1.43.36 +v1.43.37 +v1.43.38 +v1.43.39 +v1.43.4 +v1.43.40 +v1.43.41 +v1.43.42 +v1.43.43 +v1.43.44 +v1.43.45 +v1.43.5 +v1.43.6 +v1.43.7 +v1.43.8 +v1.43.9 +v1.44.0 +v1.44.1 +v1.44.10 +v1.44.100 +v1.44.101 +v1.44.102 +v1.44.103 +v1.44.104 +v1.44.105 +v1.44.106 +v1.44.107 +v1.44.108 +v1.44.109 +v1.44.11 +v1.44.110 +v1.44.111 +v1.44.112 +v1.44.113 +v1.44.114 +v1.44.115 +v1.44.116 +v1.44.117 +v1.44.118 +v1.44.119 +v1.44.12 +v1.44.120 +v1.44.121 +v1.44.122 +v1.44.123 +v1.44.124 +v1.44.125 +v1.44.126 +v1.44.127 +v1.44.128 +v1.44.129 +v1.44.13 +v1.44.130 +v1.44.131 +v1.44.132 +v1.44.133 +v1.44.134 +v1.44.135 +v1.44.136 +v1.44.137 +v1.44.138 +v1.44.139 +v1.44.14 +v1.44.140 +v1.44.141 +v1.44.142 +v1.44.143 +v1.44.144 +v1.44.145 +v1.44.146 +v1.44.147 +v1.44.148 +v1.44.149 +v1.44.15 +v1.44.150 +v1.44.151 +v1.44.152 +v1.44.153 +v1.44.154 +v1.44.155 +v1.44.156 +v1.44.157 +v1.44.158 +v1.44.159 +v1.44.16 +v1.44.160 +v1.44.161 +v1.44.162 +v1.44.163 +v1.44.164 +v1.44.165 +v1.44.166 +v1.44.167 +v1.44.168 +v1.44.169 +v1.44.17 +v1.44.170 +v1.44.171 +v1.44.172 +v1.44.173 +v1.44.174 +v1.44.175 +v1.44.176 +v1.44.177 +v1.44.178 +v1.44.179 +v1.44.18 +v1.44.180 +v1.44.181 +v1.44.182 +v1.44.183 +v1.44.184 +v1.44.185 +v1.44.186 +v1.44.187 +v1.44.188 +v1.44.189 +v1.44.19 +v1.44.190 +v1.44.191 +v1.44.192 +v1.44.193 +v1.44.194 +v1.44.195 +v1.44.196 +v1.44.197 +v1.44.198 +v1.44.199 +v1.44.2 +v1.44.20 +v1.44.200 +v1.44.201 +v1.44.202 +v1.44.203 +v1.44.204 +v1.44.205 +v1.44.206 +v1.44.207 +v1.44.208 +v1.44.209 +v1.44.21 +v1.44.210 +v1.44.211 +v1.44.212 +v1.44.213 +v1.44.214 +v1.44.215 +v1.44.216 +v1.44.217 +v1.44.218 +v1.44.219 +v1.44.22 +v1.44.220 +v1.44.221 +v1.44.222 +v1.44.223 +v1.44.224 +v1.44.225 +v1.44.226 +v1.44.227 +v1.44.228 +v1.44.229 +v1.44.23 +v1.44.230 +v1.44.231 +v1.44.232 +v1.44.233 +v1.44.234 +v1.44.235 +v1.44.236 +v1.44.237 +v1.44.238 +v1.44.239 +v1.44.24 +v1.44.25 +v1.44.26 +v1.44.27 +v1.44.28 +v1.44.29 +v1.44.3 +v1.44.30 +v1.44.31 +v1.44.32 +v1.44.33 +v1.44.34 +v1.44.35 +v1.44.36 +v1.44.37 +v1.44.38 +v1.44.39 +v1.44.4 +v1.44.40 +v1.44.41 +v1.44.42 +v1.44.43 +v1.44.44 +v1.44.45 +v1.44.46 +v1.44.47 +v1.44.48 +v1.44.49 +v1.44.5 +v1.44.50 +v1.44.51 +v1.44.52 +v1.44.53 +v1.44.54 +v1.44.55 +v1.44.56 +v1.44.57 +v1.44.58 +v1.44.59 +v1.44.6 +v1.44.60 +v1.44.61 +v1.44.62 +v1.44.63 +v1.44.64 +v1.44.65 +v1.44.66 +v1.44.67 +v1.44.68 +v1.44.69 +v1.44.7 +v1.44.70 +v1.44.71 +v1.44.72 +v1.44.73 +v1.44.74 +v1.44.75 +v1.44.76 +v1.44.77 +v1.44.78 +v1.44.79 +v1.44.8 +v1.44.80 +v1.44.81 +v1.44.82 +v1.44.83 +v1.44.84 +v1.44.85 +v1.44.86 +v1.44.87 +v1.44.88 +v1.44.89 +v1.44.9 +v1.44.90 +v1.44.91 +v1.44.92 +v1.44.93 +v1.44.94 +v1.44.95 +v1.44.96 +v1.44.97 +v1.44.98 +v1.44.99 +v1.5.0 +v1.5.1 +v1.5.10 +v1.5.11 +v1.5.12 +v1.5.13 +v1.5.2 +v1.5.3 +v1.5.4 +v1.5.5 +v1.5.6 +v1.5.7 +v1.5.8 +v1.5.9 +v1.6.0 +v1.6.1 +v1.6.10 +v1.6.11 +v1.6.12 +v1.6.13 +v1.6.14 +v1.6.15 +v1.6.16 +v1.6.17 +v1.6.18 +v1.6.19 +v1.6.2 +v1.6.20 +v1.6.21 +v1.6.22 +v1.6.23 +v1.6.24 +v1.6.25 +v1.6.26 +v1.6.27 +v1.6.3 +v1.6.4 +v1.6.5 +v1.6.6 +v1.6.7 +v1.6.8 +v1.6.9 +v1.7.0 +v1.7.1 +v1.7.2 +v1.7.3 +v1.7.4 +v1.7.5 +v1.7.6 +v1.7.7 +v1.7.8 +v1.7.9 +v1.8.0 +v1.8.1 +v1.8.10 +v1.8.11 +v1.8.12 +v1.8.13 +v1.8.14 +v1.8.15 +v1.8.16 +v1.8.17 +v1.8.18 +v1.8.19 +v1.8.2 +v1.8.20 +v1.8.21 +v1.8.22 +v1.8.23 +v1.8.24 +v1.8.25 +v1.8.26 +v1.8.27 +v1.8.28 +v1.8.29 +v1.8.3 +v1.8.30 +v1.8.31 +v1.8.32 +v1.8.33 +v1.8.34 +v1.8.35 +v1.8.36 +v1.8.37 +v1.8.38 +v1.8.39 +v1.8.4 +v1.8.40 +v1.8.41 +v1.8.42 +v1.8.43 +v1.8.44 +v1.8.5 +v1.8.6 +v1.8.7 +v1.8.8 +v1.8.9 +v1.9.0 +v1.9.00 +v1.9.44 +vrelease-v0.10.0 \ No newline at end of file diff --git a/natsort/testdata/small.txt b/natsort/testdata/small.txt new file mode 100644 index 0000000..5eee2fe --- /dev/null +++ b/natsort/testdata/small.txt @@ -0,0 +1,35 @@ +1000X Radonius Maximus +10X Radonius +200X Radonius +20X Radonius +20X Radonius Prime +30X Radonius +40X Radonius +Allegia 50 Clasteron +Allegia 500 Clasteron +Allegia 50B Clasteron +Allegia 51 Clasteron +Allegia 6R Clasteron +Alpha 100 +Alpha 2 +Alpha 200 +Alpha 2A +Alpha 2A-8000 +Alpha 2A-900 +Callisto Morphamax +Callisto Morphamax 500 +Callisto Morphamax 5000 +Callisto Morphamax 600 +Callisto Morphamax 6000 SE +Callisto Morphamax 6000 SE2 +Callisto Morphamax 700 +Callisto Morphamax 7000 +Xiph Xlater 10000 +Xiph Xlater 2000 +Xiph Xlater 300 +Xiph Xlater 40 +Xiph Xlater 5 +Xiph Xlater 50 +Xiph Xlater 500 +Xiph Xlater 5000 +Xiph Xlater 58 \ No newline at end of file