Skip to content

Instantly share code, notes, and snippets.

View benhoyt's full-sized avatar

Ben Hoyt benhoyt

View GitHub Profile
@benhoyt
benhoyt / gist:66e33fcce9094cc11ba7e2d10bfd7657
Created May 1, 2022 22:04
Go switch jump tables - before and after performance using GoAWK
# NOTES
"before" is Go version go1.19-dd97871282, before the switch jump tables commits
"after" is Go version go1.19-78bea702cd, after the switch jump tables commits
# GOAWK'S GO MICROBENCHMARKS
$ benchstat -sort=delta -geomean benchmarks_before.txt benchmarks_after.txt
name old time/op new time/op delta
IncrDecr-8 141ns ± 1% 160ns ± 2% +13.59% (p=0.008 n=5+5)
IfStatement-8 147ns ± 1% 157ns ± 2% +6.59% (p=0.008 n=5+5)
@benhoyt
benhoyt / glob.go
Created June 8, 2022 01:25
Simple glob matcher in Go
package main
import (
"fmt"
"os"
"path/filepath"
)
func main() {
if len(os.Args) != 2 {
@benhoyt
benhoyt / birthday_probability.py
Created August 5, 2016 18:27
"Birthday problem" calculator in Python
"""Calculate the probability of generating a duplicate random number after
generating "n" random numbers in the range "d".
Usage: python birthday_probability.py n [d=365]
Each value can either be an integer directly, or in the format "2**x", where
x is the number of bits in the value.
For example, to calculate the probability that two people will have the same
birthday in a room with 23 people:
@benhoyt
benhoyt / csvify.awk
Last active January 23, 2023 08:54
csvify: try to parse CSV with regular AWK
BEGIN {
FS = ","
}
{
nf = csvify(fields)
for (i=1; i<=nf; i++) {
printf "|%s|\n", fields[i]
}
@benhoyt
benhoyt / multiply.go
Created September 19, 2023 20:11
Tiny Go web server to multiply two integers
package main
import (
"fmt"
"net/http"
"strconv"
)
func main() {
http.HandleFunc("/multiply", func(w http.ResponseWriter, r *http.Request) {
@benhoyt
benhoyt / connect4.go
Last active October 26, 2023 22:40
Connect 4 solver
// A little "Connect Four" game
package main
import (
"bufio"
"flag"
"fmt"
"os"
"strconv"
@benhoyt
benhoyt / scan.go
Created December 20, 2023 08:34
Proposed Rows.ScanRow implementation (cut-down version)
package model
import (
"database/sql"
"errors"
"fmt"
"reflect"
"sync"
)
@benhoyt
benhoyt / sliding_window_sort.py
Created February 22, 2017 20:49
Efficient sliding-window sorting of time-series data in CSV file (in Python)
"""Efficient sliding-window sorting of time-series data in CSV file.
Demo for http://stackoverflow.com/a/42398981/68707
Tested on Python 3.5.
"""
import collections
import csv
import datetime
@benhoyt
benhoyt / markov.py
Created November 11, 2023 15:45
Generate text from an input using a simple Markov chain generator
import collections, random, sys, textwrap
# Build possibles table indexed by pair of prefix words (w1, w2)
w1 = w2 = ''
possibles = collections.defaultdict(list)
for line in sys.stdin:
for word in line.split():
possibles[w1, w2].append(word)
w1, w2 = w2, word
@benhoyt
benhoyt / gist:4044946
Created November 9, 2012 09:59
Speed up os.walk() significantly by using file attributes from FindFirst/Next or readdir
"""Speed up os.walk() significantly by using file attributes that
FindFirst/Next give us instead of doing an extra stat(). Can also do the same
thing with opendir/readdir on Linux.
This is doubly useful when the user (caller of os.walk) is doing *another*
stat() to get say the file sizes.
On my tests (Windows 64-bit) our walk() is about 5x as fast as os.walk() for
large directory trees, and 9x as fast if you're doing the file size thing.
Note that these timings are "once it's in the cache", not first-time timings.